Entwickler-Ecke
Datenbanken - Anzeige von Informationen !
Jagg - Di 16.07.02 08:37
Titel: Anzeige von Informationen !
Hallo !
Ich habe eine Datenbank und will diese auf dem Formular ausgeben !
Ich habe dabei alles dynamisch erzeugt !
Hier ist mein Code :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TForm3.FormCreate(Sender: TObject); var T : TTable; L : TLabel; D : TDataSource; i : integer; begin Image1.Picture.LoadfromFile ('F:\Kasse\ProgrammDaten\Panel1.bmp'); T := TTable.Create(form3); T.DatabaseName := 'C:\Nguyen\Info Post Programm\'; T.TableName := 'Material1.dbf'; T.Active := True; D := TDataSource.Create(form3); D.DataSet := T; while not T.eof do begin if (T['Artnr']>=1)and(T['Artnr']<=10) then begin L := TLabel.create(Form3); L.parent := Form3; L.Caption :=T['Wasdenn']; L.Font.Name := 'Lucida Console'; L.Font.Size := 9; L.Font.Style := [fsBold]; L.Top := i*22; L.Left := 150; L.Transparent := True; T.next; end; L.free; T.free; D.free; end; end; |
Hierbei soll er nur die Angaben,die die "ArtNr-Zahlen" zwischen 1 und 10 haben, ausgeben !
Er schreibt aber nichts hin,könnt ihr mir sagen warum ???
Jagg !
wwerner - Di 16.07.02 08:45
Weist du was ein Debugger ist? Damit kann man sein Programm in einzelschritten durchgehen und sich Variablen ansehen. Vielleicht hat deine Tabelle keine Daten?....
Gruß
WW
Jagg - Di 16.07.02 08:54
Doch hat SIE !
wwerner - Di 16.07.02 08:59
Ein paar Bemerkungen
Warum erzeugst du D?
Warum gibst du L frei? (überleg mal was du da machst!)
Versuch mal T.FieldByName('WasDenn').asstring.
Jagg - Di 16.07.02 09:16
Es ist ja alles dynamisch erzeugt worden,daher müssen auch alle Komponenten erzeugt werden,die auch sonst benutzt werden.
L.free = Warum sollte ich das nicht machen ? Ich muss den Speicher doch wieder freigeben oder nicht ?
D := Dazu habe ich oben ja was gesagt !
Table.fieldbyname = Man kann das was ich geschrieben habe oder das nehmen was du geschrieben hast,ist beides das gleiche !
Jagg !
wwerner - Di 16.07.02 09:21
Du erzeugst D und machst nix damit! Warum wird es dann erzeugt?
Welches L gibst du frei? Das erste? Das letzte? Das 3.?
Ich verstehe es nicht!
Hast du den Debugger jetzt mal benutzt?
Gruß
WW
Jagg - Di 16.07.02 09:28
Also,D ist ja DataSource und den habe ich mit der Tabelle verbunden,also habe ich was gemacht damit,sonst hätt ich es nicht erzeugen müssen,oder ?
Stimmt,das mit dem L.free muss ich nochmal überlegen,ich glaube ich muss mal ein Array nehmen,weil es müssen ja viele ausgegeben werden !
Den Debugger habe ich benutzt aber ich kann nicht damit umgehen !!!
Jagg !
Buggi - Di 16.07.02 11:16
Hi Jagg,
teilweise muß ich Werner rechtgeben. D brauchst Du wohl nicht. L würde ich innerhalb des If-Blocks zerstören, dann müßte es auch das richtige L sein. Und T, so scheint es mir, zerstörst Du schon nach dem ersten Schleifendurchgang. Ich denke "T.free" gehört außerhalb der while-Schleife.
Wundert mich sowieso das Du noch auf T zugreifen kannst, obwohl es nicht mehr existiert. :?
Gruß Buggi
wwerner - Di 16.07.02 11:22
:D Stimmt, das mit der Whileschleife ist mir noch gar nicht aufgefallen
Wenn L freigegeben wird, kann es dann noch angezeigt werden?
Gruß
WW
Lemmy - Di 16.07.02 11:34
Hi Leute,
wenn er L innerhalb der Schleife wieder freigibt, dann sind ja gerade die Labels weg, die er zum anzeigen benötigt.
Die Freigabe von T an das Ende der Procedure schieben, da es sonst nach dem ersten Schleifendurchlauf weg ist. D wird nicht benötigt.
Das mit der Freigabe ist bei Delphi so ne Sache. In der Onlinehilfe steht zu Parent:
Hinweis: Die in TControl deklarierte Eigenschaft Parent ähnelt der Eigenschaft Owner von TComponent darin, daß die hier angegebenen Objekte für das Freigeben des Steuerelements zuständig sind. Jedoch ist das in Parent enthaltene Objekt immer eine fensterorientierte Komponente, die das Steuerelement visuell enthält und beim Speichern des Formulars für das Schreiben des Steuerelements in einen Stream verantwortlich ist. Owner enthält das Objekt, das beim Instantiieren des Steuerelements als Parameter an den Konstruktor übergeben wurde. Dieser Eigentümer veranlaßt das Speichern aller Objekte (einschließlich des Steuerelements und seiner übergeordneten Komponente), wenn das Formular gespeichert wird.
Soll heißen: Sobald ein Parent/Owner angegeben wird (i.d.R. eine Form, Panel,..) werden die erzeugten Komponenten bei der Freigabe des Parents ebenfalls freigegeben. Erzeugst Du also nur beim Create des Forms die Labels, Tabels,... dann musst Du diese nicht freigeben, wenn Du beim Schließen des Forms das Form FREIGIBTS (Im OnClose: Action:=caFree; oder Form.Release; im aufrufenden Code). Wenn Du aber eine Aktualisierung der Anzeige planst, bei der eine andere Anzahl von Items auftreten können, musst Du die Freigabe der Labels wieder übernehmen, d.h. Alle von Hand erzeugten Labels wieder freigeben.
Weshalb bei Dir keine Daten angezeigt werden weiß ich nicht. Wirf auf alle Fälle mal die .Frees raus, dann müssten wenigstens die 10 Lables dastehen.
Habe es gerade gesehen: Die 10 Labels stehen übereinander, weil sie die gleichen Top/Left-Werte haben. Du benutzt zwar i um den Wert zu änern, dieser wird aber in der Schleife nicht verändert!
Grüße
Lemmy
Buggi - Di 16.07.02 11:46
Hi Jagg, Werner,
ich hab da trotzdem Bockmist geschrieben. Ich kann natürlich L nicht wieder killen. Das ist ja das Label!!
Habs mal selbst probiert mit meiner Datenbank:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TForm1.FormCreate(Sender: TObject); var T : TTable; L : TLabel; i : integer; begin i := 50; T := TTable.Create(form1); T.DatabaseName := 'duty'; T.TableName := 'Materialauftrag1.db'; T.Active := True; while not T.eof do begin if (T['Posten']>=1906)and(T['Posten']<=1910) then begin L := TLabel.create(Form1); L.parent := Form1; L.Caption :=T['Produkt']; L.Font.Name := 'Lucida Console'; L.Font.Size := 9; L.Font.Style := [fsBold]; L.Top := i; L.Left := 150; L.Transparent := true; i := i+10; end; T.next; end; T.free; end; |
So funzt es :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!