Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zur Laufzeit generierte Listbox kopieren...


AceTheFace - Mo 16.12.02 12:33
Titel: Zur Laufzeit generierte Listbox kopieren...
Hallo,

ich möchte den Inhalt einer Datenbank in eine zur Laufzeit generierte Listbox werfen und diese dann in eine Listbox auf meiner Oberfläche kopieren.
Auslesen und erstellen mache ich so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TStandortVerwalter.DB_einlesen:TListbox; 
var StandortListe:TListbox;
    aktStandort:TStandort;
begin
StandortListe:=TListbox.create(nil);
aktStandort:=TStandort.create;
QStandort.SQL.clear;
QStandort.SQL.Add('Select Bezeichnung from Standort');
QStandort.open;
QStandort.First;
while not QStandort.EOF do begin
        aktStandort.Bezeichnung:=TStringField(QStandort.fieldbyname('Bezeichnung')).asString;
        aktStandort.ID:=TStringField(QStandort.fieldbyname('ID')).asInteger;
        StandortListe.Items.AddObject(aktStandort.Bezeichnung,TStandort(aktStandort));
        QStandort.next;
        end;
result:=StandortListe;

end;


Die Befehle in der Gui sehen so aus:


Quelltext
1:
2:
3:
4:
procedure TForm1.Button2Click(Sender: TObject);
begin
Listbox1.Items:=verwalter.DB_einlesen.Items;
end;


Doch wenn ich auf den Button drücke bekomme ich immer:
"Control '' has no parent window"

Liegt das daran, dass ich Listbox.create(nil) gemacht habe oder so?!

Gruss und danke,

Ace


smiegel - Mo 16.12.02 12:55

Hallo,

warum mit Kanonen auf Spatzen schiessen?

Wenn Du Dir einmal die Deklaration der Listbox.Items genauer angeschaut hättest, würdest Du feststellen, dass die Items in einer Stringliste verwaltet werden.

Folgend eine Modifizierung Deines Codes:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function TStandortVerwalter.DB_einlesen(aItems:TStrings):Integer; 
var aktStandort:TStandort; // ist das ein Record oder ein Objekt?
begin 
  Result:=0;
  if (aItems=nil) then Exit;
  aItems.Clear;
  with QStandort do
  begin
    SQL.clear; 
    SQL.Add('Select Bezeichnung, ID from Standort'); 
    Open; 
    Result:=RecordCount;
    //QStandort.First;  --> überflüssig, da nach Open immer auf dem 1. DS
    while not EOF do begin 
      // FillChar(aktStandort, SizeOf(TStandort), #0); --> wenn Record
      aktStandort.Bezeichnung:=Fieldbyname('Bezeichnung').AsString; 
      aktStandort.ID:=Fieldbyname('ID')).AsInteger; 
      aItems.AddObject(aktStandort.Bezeichnung, TStandort(aktStandort)); 
      Next; 
    end; // while
  end; // with
end; // TStandortVerwalter.DB_einlesen

Aufgerufen wird das ganze dann so:

Quelltext
1:
2:
3:
4:
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  Verwalter.DB_einlesen(Listbox1.Items); 
end;


AceTheFace - Mo 16.12.02 12:55

Also ich bin ein kleines Stückchen weiter gekommen. Ich muss wohl irgendwie über StandortListe.createParent(aParent) das "Elternfenster" festlegen. Allerdings steht das teil ja nur in einer unit, die keinerlei grafische sachen hat, kann also nicht einfach form1 oder so angeben.
Zum Testen benutze ich aber ja eine andere unit, wenn ich allerdings über StandortListe.createParent(TestForm.Form1) diese Form als Elternfenster angeben will, sagt er mir, dass er TestForm nicht kennt obwohl testform ja diese unit in der uses klausel benutzt.....

Probleme über Probleme...bitte um Hilfe :)

Gruss,

Ace


AceTheFace - Mo 16.12.02 12:59

Standort ist ein Objekt....


Quelltext
1:
2:
3:
4:
type TStandort=class
      Bezeichnung:String;
      ID:Integer;
      end;


Gruss,

Ace


smiegel - Mo 16.12.02 13:04

Hallo, dann musst Du das Objekt auch erzeugen, bevor Du es mit AddObject in die Liste kopierts.

In etwa so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
    while not EOF do begin 
      aktStandort:=TStandort.Create;
      aktStandort.Bezeichnung:=Fieldbyname('Bezeichnung').AsString; 
      aktStandort.ID:=Fieldbyname('ID')).AsInteger; 
      aItems.AddObject(aktStandort.Bezeichnung, aktStandort); 
      Next; 
    end; // while


AceTheFace - Mo 16.12.02 18:34

DANKE :!:

Hast mir sehr geholfen :)
Gruss,

Ace