Ver Mensaje Individual
  #17  
Antiguo 03-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
hola ecfisa!!!

Ante todo gracias por la explicacion que me diste en el hilo.

ahora bien, necesito si podes explicarme para que sirve la variable BM de tipo TBookMarkStr, tambien como hacer para que no lo

tire todo hacia la derecha,y por ultimo para que tambien exporte el nombre de las columnas del DBGrid. con eso no te molesto mas.
te vuelvo a repetir, muchisimas gracias por la explicacion anterior.

saludos.

Hola ezequiel913.

Tal como me solicitaste por correo privado intentaré explicarte los tres puntos que consultas.

1) Marcas de posición
Empecemos por TBookmark de tipo Pointer, que puede almacenar la posición de un registro de un TDataSet y por lo tanto regresar a él despues de realizar algún desplazamiento en el DataSet. Es decir que nos permite 'marcar' un punto del DataSet para luego retornar a él.

Su uso va aparejado de tres métodos: GetBookmark, GotoBookmark y FreeBookmark.
GetBookmark nos permite obtener la posición del registro actual del DataSet.
GotoBookmark nos posiciona en el registro previamente guardado en Bookmark
FreeBookmrk libera el recurso utilizado.

Ejemplo:
Código Delphi [-]
...
var
  BM: TBookmark;
begin
  BM:= DataSet.GetBookmark;   // guardar en BM la posición del registro actual
  try
    while not DataSet.Eof do  // desplazarse hasta el fin del DataSet
      DataSet.Next;
  finally
    DataSet.GotoBookmark(BM); // volver al registro almacenado en BM
    DataSet.FreeBookmark;     // liberar el recurso
  end;
end;

Pero existe el tipo TBookmarkStr con igual finalidad y resultado.TBookmarkStr es de tipo string (no Pointer) y usándolo, el ejemplo anterior quedaría:
Código Delphi [-]
...
var
  BM: TBookmarkStr;
begin
  BM:= DataSet.Bookmark;     // guardar en BM la posición del registro actual
  while not DataSet.Eof do   // desplazarse hasta el fin del DataSet
    DataSet.Next;
  DataSet.Bookmark:= BM;     // volver al registro almacenado en BM.
end;
Como verás este es más simple de usar.

2) Texto a la derecha o izquierda.
Simplificando es sólo una manipulación de cadenas de caracteres. Por ejemplo si quiero ajustar un string a una longitud de 30 caracteres y este tiene 12,
le faltan 18 para completar los 30. Entonces:

Completar 30 caracteres con contenido a la izquierda:
Código Delphi [-]
var
 st: string;
begin
  st:= 'TBookmarkStr';
  st:= StringOfChar(' ',30-Length(st)) + st; 
  // ahora st vale '                    TBookmarkStr'

Completar 30 caracteres con contenido a la derecha:
Código Delphi [-]
var
  st: string;
begin
  st:= 'TBookmarkStr';
  st:= st + StringOfChar(' ',30-Length(st)); 
  // ahora st vale 'TBookmarkStr                     '

Centrar contenido en 30 caracteres:
Código Delphi [-]
var
  st: string;
begin
  st:= 'TBookmarkStr';
  st:= StringOfChar('.',(30-Length(st)) div 2)
       +st+
       StringOfChar('.',(30-Length(st)) div 2);
   // ahora st vale '       TBookmarkStr         '
  ...
end;

3)Para exportar el título de las columnas agregamos: (texto en negrita)
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  BM: TBookMarkStr;
  i: Integer;
  s: string;
  ArchTexto: TextFile;
begin
  AssignFile(ArchTexto,'C:\A_LA_DERECHA.TXT');
  Rewrite(ArchTexto);
  BM:= DBGrid1.DataSource.DataSet.Bookmark;
  DBGrid1.DataSource.DataSet.DisableControls;
  // Comienza exportar titulos de columnas
  s:= '';
  for i:= 0 to DBGRid1.Columns.Count -1 do
    s:= s + StringOfChar(' ', DBGrid1.Fields[i].DisplayWidth-
                         Length(DBGrid1.Columns[i].Title.Caption)) +
                         DBGrid1.Columns[i].Title.Caption;
  Writeln(ArchTexto, s);
  Writeln(ArchTexto);
  // Fin exportar titulos de columnas
  DBGrid1.DataSource.DataSet.First;
  for i:= 0 to DBGrid1.Column
  while not DBGrid1.DataSource.DataSet.Eof do
  begin
    s:= '';
    for i:= 0 to DBGrid1.FieldCount - 1 do
    begin
      (* llenar con blancos a la izquierda (largo físico de campo - largo) y concatenar *)
      s:= s + StringOfChar(' ', DBGrid1.Fields[i].DisplayWidth -
                           Length(DBGrid1.Fields[i].AsString)) +
                           DBGrid1.Fields[i].AsString;
    end;
    Writeln(ArchTexto, s); (* guardar campos formateados del registro  *)
    DBGrid1.DataSource.DataSet.Next;
  end;
  CloseFile(ArchTexto);
  DBGrid1.DataSource.DataSet.Bookmark:= BM;
  DBGrid1.DataSource.DataSet.EnableControls;
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita