Einzelnen Beitrag anzeigen

Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Listview Spalten zur Laufzeit?

  Alt 29. Apr 2004, 05:25
Delphi-Quellcode:
const SQL_Names: array [0..Spalten] of String = (<Spaltenname1>, <Spaltenname1>, ...);
const List_Names: array [0..Spalten-1] of String = (<Spaltenname1>, <Spaltenname1>, ...);

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := to Spalten-1 do
  begin
    CheckListBox1.Items.Add(List_Names[i]);
    CheckListBox1.Checked[i] := True;
  end;
end;

procedure TForm1.bSucheClick(Sender: TObject);
var
  bFirst: Boolean;
  i: Integer;
  ListItem : TlistItem;
begin
  bFirst := False;
  Screen.Cursor := crHourGlass;
  lfertig.Caption:= '';
  lInfo.Caption:='';
  Memo1.Lines.Clear;
  dbMain.HostName:=SetupForm.edServer.Text; //Server
  dbMain.User:=SetupForm.edLogin.Text; //Benutzername
  dbMain.Password:=SetupForm.edPassword.Text; //Passwort
  dbMain.Database:=SetupForm.edDB.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  lvAnzeige.Items.Clear;
  try
    qrMain.SQL.Text :=
      'SELECT * ' +
      'FROM ' +
      'table_ordertracking T,' +
      'kundenmg K ' +
    'WHERE ' +
      'T.Customer_Number=K.Customer_Number ' +
      'AND ' +
      'T.Customer_Number like ''' + edknr.Text + '''"%" ' +
      'AND ' +
      'T.Order_Number like ''' + edatnr.Text + '''"%" ' +
    'ORDER BY ' +
      'T.DPrint;';

    qrMain.Open;
    qrMain.FieldByName('Order_Type').AsString;
    gauge1.Visible:= True;
    gauge1.maxvalue := qrMain.recordcount;
    lvAnzeige.Items.BeginUpdate;
    lv_Anzeige.Columns.Clear;
    for i := 0 to Spalten-1 do
    begin
      if CheckListBox1.Checked[i] then
        lv_Anzeige.Columns.Add.Caption := List_Names[i];
    end;
    while not qrMain.Eof do
    begin
      ListItem := lvAnzeige.Items.Add;
      ListItem.Caption:=qrMain.FieldByName('Order_Type').AsString;
      for i := 0 to Spalten-1 do
      begin
        if CheckListBox1.Checked[i] then
        begin
          if bFirst then
          begin
            if SQL_Names[i] = 'First_Eventthen
              ListItem.Caption := FormatDateTime('dd.mm.yyyy hh:mm:ss', qrMain.FieldByName(SQL_Names[i]).AsDateTime);
            else
              ListItem.Caption := qrMain.FieldByName(SQL_Names[i]).AsString;
            bFirst := False;
          end
          else
          begin
            if SQL_Names[i] = 'First_Eventthen
              ListItem.SubItems.Add(qrMain.FieldByName(FormatDateTime('dd.mm.yyyy hh:mm:ss', qrMain.FieldByName(SQL_Names[i]).AsDateTime));
            else
              ListItem.SubItems.Add(qrMain.FieldByName(SQL_Names[i]).AsString);
          end;
        end;
      end;
      gauge1.progress := gauge1.progress + 1;
    end;
    lvAnzeige.Items.EndUpdate;
    gauge1.progress := 0;
    gauge1.Visible:= false;
  finally
    dbMain.Connected:=False; //Verbindung trennen
    Screen.Cursor := Cursor;
  end;
end;
Also, das Programm braucht noch eine CheckListBox, in der drinnensteht, welche Spalten angezeigt werden sollen. Alternativ kannst du auch ein Array verwenden. Vor dem Einfügen von Daten in die Listview werden die Spalten nochmals neu eingetragen. Anschließend geht die Schleife alle Spalten durch, und falls eine Spalte angezeigt werden soll, wird der Text hinzugefügt. Die Unterscheidung mit bFirst ist hoffentlich offensichtlich, da das erste Element mit Caption, die nachfolgenden aber über SubItems angesprochen werden. Ich hoffe der Code funzt, ich habe ihn nicht getestet.
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat