Autor Beitrag
Jagg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 635



BeitragVerfasst: Di 16.07.02 08:37 
Hallo !

Ich habe eine Datenbank und will diese auf dem Formular ausgeben !
Ich habe dabei alles dynamisch erzeugt !
Hier ist mein Code :

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 635



BeitragVerfasst: Di 16.07.02 08:54 
Doch hat SIE !
wwerner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 635



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 635



BeitragVerfasst: 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 !
wwerner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: Di 16.07.02 10:04 
WARUM erzugst du D?
Debuggeranleitung: www.fh-wedel.de/~ps2...delphi_progstil.html
Buggi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: 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:
ausblenden 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