![]() |
Listview Spalten zur Laufzeit?
Hi
Hab mal wieder ein Problem! Mit untem stehendem Code füge ich das Abfrage Ergebnis in eine Listview ein. Wie kann ich es jetzt machen, das ich mit Hilfe von Checkboxen auswählen kann welche Spalten aus der SQL Abfrage in das Listview eingefügt werden? Nach möglichkeit möchte ich die Spaltenüberschrift aber weiterhin selber angeben und nicht aus der SQL übernehmen. Z.B. steht in der SQL DB die Spalte "Customer_Number"! Ich möchte aber das Sie in der Listview "Kunden Nr" heißt! Ist das überhaupt machbar? Also im Moment habe ich ja die Spaltenüberschriften fest vorgegeben :gruebel:
Delphi-Quellcode:
procedure TForm1.bSucheClick(Sender: TObject);
var ListItem : TlistItem; begin 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; while not qrMain.Eof do begin ListItem := lvAnzeige.Items.Add; ListItem.Caption:=qrMain.FieldByName('Order_Type').AsString; ListItem.SubItems.Add(qrMain.FieldByName('Customer_Number').AsString); ListItem.SubItems.Add(qrMain.FieldByName('Order_Number').AsString); ListItem.SubItems.Add(FormatDateTime('dd.mm.yyyy hh:mm:ss', qrMain.FieldByName('First_Event').AsDateTime)); ListItem.SubItems.Add(qrMain.FieldByName('DPrint').AsString); ListItem.SubItems.Add(qrMain.FieldByName('PrePrint').AsString); ListItem.SubItems.Add(qrMain.FieldByName('Print').AsString); ListItem.SubItems.Add(qrMain.FieldByName('BMSLogout').AsString); ListItem.SubItems.Add(qrMain.FieldByName('Count_DPrint').AsString); ListItem.SubItems.Add(qrMain.FieldByName('CeWe_Batch').AsString); 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; Gruß Celina |
Re: Listview Spalten zur Laufzeit?
Delphi-Quellcode:
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.
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_Event' then 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_Event' then 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; |
Re: Listview Spalten zur Laufzeit?
Hi Alcaeus
:shock: Super !! :thuimb: Du bist ein Schatz! Danke das du dir so viel mühe gemacht hast! Ich werde mal versuchen nachzuvollziehen was du da gemacht hast, und den Code dann testen. :coder: Vielen Vielen Dank! Melde mich wieder... Liebe Grüße Celina |
Re: Listview Spalten zur Laufzeit?
Hi...
Kann sich mal einer ansehen was hier nicht stimmt :gruebel: Alcaeus versucht mir zu helfen eine Listview mit den Felder zu füllen, die in der Checklistbox gewählt sind.
Delphi-Quellcode:
//###########################################################################
const Spalten=3; const SQL_Names: array [0..Spalten-1] of String = ('Order_Type', 'Order_Number', 'Customer_Number'); const List_Names: array [0..Spalten-1] of String = ('Type', 'Auftrag', 'Kunde'); procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin Memo1.Lines.Clear; for i := 0 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; 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.Customer_Number;'; qrMain.Open; qrMain.FieldByName('Order_Type').AsString; gauge1.Visible:= True; gauge1.maxvalue := qrMain.recordcount; lvAnzeige.Items.BeginUpdate; lvAnzeige.Columns.Clear; for i := 0 to Spalten-1 do begin if CheckListBox1.Checked[i] then lvAnzeige.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 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; Gruß Celina |
Re: Listview Spalten zur Laufzeit?
Hi Alcaeus :hello:
Irgendwas ist noch falsch :gruebel: Das Programm läuft zwar, aber es wird nichts in die Listview eingetragen. In der CheckListBox hab ich alle 3 Möglichkeiten ausgewählt. In der TlistView werden aber nur zwei Spaltenüberschriften angezeigt :gruebel: Daten kommen leider gar keine. Irgendwo hat sich da ein Fehler ...... :?: Gruß Celina |
Re: Listview Spalten zur Laufzeit?
hallo celina,
nirgendwo wird bfirst gestetzt, der kann keine daten reinschreiben, da bfirst := false ist. raik |
Re: Listview Spalten zur Laufzeit?
Hi Raik :hi:
:gruebel: Bfirst:= true; :?: Ich denke das muss so ausehen oder :?:
Delphi-Quellcode:
Gruß Celina
if CheckListBox1.Checked[i] then
begin if bFirst = true then begin ListItem.SubItems.Add(qrMain.FieldByName(SQL_Names[i]).AsString); |
Re: Listview Spalten zur Laufzeit?
nur wenn bfirst = true ist schreibt er die daten darein.
du hast aber bfirst oben auf false gesetzt, und nie wieder geändert, frage was macht bfirst? raik |
Re: Listview Spalten zur Laufzeit?
:shock:
Zitat:
|
Re: Listview Spalten zur Laufzeit?
schreibe mal zum test bfirst:= true vor die abfrage
Delphi-Quellcode:
if bfirst then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz