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 !


wwerner - Di 16.07.02 10:04

WARUM erzugst du D?
Debuggeranleitung: http://www.fh-wedel.de/~ps2/menu_3/4_delphi_progstil.html


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