Probleme beim Initialisieren von Array of TLabel

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

Hi zusammen, hier ich mal wieder. :oops:

Folgendes Problem:

Muss eine Liste mit 11 Spalten und einer unbekannten Anzahl von Zeilen (max. 20) auf einem Panel ausgeben.
Dazu habe ich mir ein Array geschaffen vom Type TLabel. (Arbeitsblatt_Ausgabe : array[1..11, 1..20] of TLabel;)
Dann habe ich eine Procedure geschrieben, mit der die Ausgangswerte gesetzt werden sollen :

Code: Alles auswählen

procedure IniArbeitsblatt;
var
  Spalte, Zeile, oben, links : Integer;
 
Begin
  oben := 35;
  links := 10;
  For Zeile := 1 to 20 do
  Begin
     For Spalte := 1 to 11 do
     Begin
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible       := false;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Top            := oben*Zeile;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Left           := links+(Spalte*40);
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Height        := 25;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].AutoSize     := true;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption      := '';
        Arbeitsblatt_Ausgabe[Spalte,Zeile].DragCursor  := crNone;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Font.Color  := clMaroon;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].font.Height := -19;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].Font.Bold    := true;
        Arbeitsblatt_Ausgabe[Spalte,Zeile].ParentColor := false;
     end;
  end;
end;


Außerdem ist da noch die Procedure, die die Property belegen, also Visible := true und Caption := Eingabe.
Da gibt es allerdings (noch) keine Probleme.

Starte ich nun das Programm mit F9, dann heißt es erstmal "alles grün und fertig.
Dann kommt die erste Fehlermeldung:
Fehlermeldung1.JPG
Fehlermeldung1.JPG (20.37 KiB) 2318 mal betrachtet

In Zeile 1151 steht dann:
Fehlermeldung1-2.JPG


Wenn ich dann trotzdem das Programm weiter ausführe kommt Meldung Nr.3 :
Debuggerfehler.JPG
Debuggerfehler.JPG (20.8 KiB) 2318 mal betrachtet


Was könnte passiert sein ? Was mache ich falsch ?

Natürlich könnte ich auch die Label's direkt auf dem Panel platzieren, aber das wären dann 220 Stück und die Zuweisung von Daten über eine Case-Anweisung ist dann doch sehr aufwendig.

Bernhard
Zuletzt geändert von Lori am Mo 13. Feb 2017, 16:42, insgesamt 1-mal geändert.
Grund: Highlighter

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von theo »

Wahrscheinlich hast du vergessen, die Labels zu createn

Code: Alles auswählen

 
Arbeitsblatt_Ausgabe[Spalte,Zeile]:=TLabel.Create(Form1);.


Freen musst du sie ggf. auch wieder.

Für diese Zwecke gäbe es statt Array auch TComponentList
http://www.freepascal.org/docs-html/3.0 ... tlist.html

BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

theo hat geschrieben:Wahrscheinlich hast du vergessen, die Labels zu createn

Code: Alles auswählen

 
Arbeitsblatt_Ausgabe[Spalte,Zeile]:=TLabel.Create(Form1);.


Freen musst du sie ggf. auch wieder.

OK - mein Fehler, hab das tatsächlich vergessen.
Und den Speicher muss man auch wieder expliziet freigeben ? Geschied das nicht automatisch beim Beenden des Programms ?

Für diese Zwecke gäbe es statt Array auch TComponentList
http://www.freepascal.org/docs-html/3.0 ... tlist.html


Mit der TComponentList habe ich mich noch nicht beschäftigt.
Wie schon einmal erwähnt habe ich vor über 30 Jahren in TurboPascal programmiert (damals unter DOS, Windows kam gerade neu auf den Markt) und vor ca. 15 Jahren mal in Delphi 5 reingeschaut.
Von daher sind meine Erfahrungen bescheiden.

Vielen Dank für die Hilfe - probiere es gleich mal aus.

Bernhard

BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

Das Programm läuft jetzt wieder ohne Fehlermeldung, jedoch erscheint die Ausgabe nirgends oder irgendwo im Nirvana.
Jedenfalls nicht auf meinem Panel PArbeitsblatt, wo sie erscheinen muss (oder sollte).

Irgend jemand eine Idee ?

Bernhard

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von Jole »

Liegt es vielleicht an dieser Zeile?

Code: Alles auswählen

Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible := false;

BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

Bei den Zuweisungen betrifft das nur den Zeitstempel und der soll auch nicht erscheinen.
Mit gespeichert wird er schon, aber gedacht ist der, damit später im Protokoll ersichtlich ist, wann ich den Auftrag angenommen habe.
Die eingaben werden in eine Actionliste eingetragen, die nur der Zwischenspeicherung dient, bevor beim Beenden des Programms die Daten in die
entsprechenden Dateien gespeichert werden. Aus der Actionliste wird dann auf Wunsch ein Protokoll zusammengestellt und ausgedruckt.
So sichere ich mir die Daten durch Verlust bei Computerausfall.

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von Jole »

Ausgehend von deiner Frage, nehme ich an, dass du Labels zur Laufzeit erzeugen und Anzeigen willst. Oder?
Also die einfachste Form:

Code: Alles auswählen

  L[0]:= TLabel.Create(Form1);
  L[0].Left:= 12;
  L[0].Top:= 12;
  L[0].Caption:= 'Label 1';
  L[0].Visible:= True;
  L[0].Parent:= Form1;

Ohne ein Visible:= True, wird das nie Angezeigt. Vielleicht hast du aber auch noch irgentwo das .Parent:= ... vergessen?

BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

Hier mal der Vollständigkeit halber der gesamte relevante Quelltext :

.

Code: Alles auswählen

    var
.
.     // 2-dimentionales Feld zur Anzeige der Aufträge auf PArbeitsblatt
.     // Format Spalte / Zeile
.       Arbeitsblatt_Ausgabe : array[1..11, 1..20] of TLabel;
 
Beim Erstellen des Hauptformulars wird das Array dann inialisiert :
 
.     procedure THauptFormular.FormCreate(Sender: TObject);
.     begin
.        {Formular vertikal und horizontal ausrichten}
.        HauptFormular.Top    := 0;
.        HauptFormular.Left   := -5;
.        HauptFormular.Height := 890;
.        HauptFormular.Width  := Screen.Width;
.        {Ausgabe auf Panel Arbeitsblatt initialisieren}
.        IniArbeitsblatt;
.    end;
 
..... mit Hilfe dieser Procedure
 
.     procedure IniArbeitsblatt;
.     var
.       Spalte, Zeile, oben, links : Integer;
.     
.     Begin
.       oben := 50;
.       links := 10;
.       For Zeile := 1 to 20 do
.       Begin
.          For Spalte := 1 to 11 do
.          Begin
.             Arbeitsblatt_Ausgabe[Spalte,Zeile] := TLabel.Create(Hauptformular.PArbeitsblatt);
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible     := false;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].Enabled     := true;
.             if Spalte = 1 then
.                Arbeitsblatt_Ausgabe[Spalte,Zeile].Top         := oben
.            else
.                Arbeitsblatt_Ausgabe[Spalte,Zeile].Top         := oben+(Zeile*25);
.             if Spalte = 1 then
.                Arbeitsblatt_Ausgabe[Spalte,Zeile].Left     := links
.             else
.                Arbeitsblatt_Ausgabe[Spalte,Zeile].Left     := links+(Spalte*40);
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].Height      := 25;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].AutoSize    := true;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption     := '';
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].DragCursor  := crNone;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].Font.Color  := clMaroon;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].font.Height := -19;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].Font.Bold   := true;
.             Arbeitsblatt_Ausgabe[Spalte,Zeile].ParentColor := false;
.          end;
.       end;
.     end;
.     
..... dabei werden erst einmal alle Labels auf visible = false gesetzt.
 
..... danach erfolgt der Übertrag der Daten (ausgelöst durch den Click auf den Button "übernehmen"), wobei alle betroffenen Labels, die auch angezeigt werden sollen,
..... expliziet auf visible = true gesetzt werden :
 
.     procedure THauptFormular.UebernehmenClick(Sender: TObject);
.     var
.        temp1, temp2 : String;
.        Zeile : Integer;
.        Spalte : Integer;
.        AnzSpalte : Integer = 11;
.        jetzt : TDateTime;
.     
.     begin
.       //suchen der Zeilennummer
.       temp1 := AuftragLabel.Caption;
.       temp2 := Copy(temp1, length(temp1)-1, 2);
.       if length(temp2) <> 2 then
.          setLength(temp2,2);
.       Zeile := StrToInt(temp2);
.       jetzt := Now;
.     
.     { Versuch die Eingaben über ein dynamisches Array auf dem Panel "PArbeitsblatt" auszugeben }
.     
.       For Spalte := 1 to AnzSpalte do
.       Begin
.          case Spalte of
.              1 : Begin   // Zeitstempel
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  DateTimeToStr(jetzt);
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  false;
.                  End;
.              2 : Begin   // Zeilen Nr.
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  IntToStr(Zeile);
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              3 : Begin   // Anfahrstelle
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragAnfahrstelle.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              4 : Begin   // LabelLand
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragLand.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              5 : Begin   // Postleitzahl
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragPLZ.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              6 : Begin   // Stadt
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragStadt.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              7 : Begin   // LabelAnkunft bei dr Anfahrstelle
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragAnkunft.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              8 : Begin   // LabelAbfahrt zur nächsten Anfahrstelle
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragAbfahrt.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.              9 : Begin   // Tachostand bei LabelAnkunft zur Ermittlung der Anfahrstrecke
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragKM.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.             10 : Begin   // Kennzeichnung des angelieferten Containers
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragContainer.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.             11 : Begin   // Auftragsnummer
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Caption :=  AuftragNummer.Text;
.                     Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible :=  true;
.                  End;
.           end;
.        end;
.     
.     //löschen der Eingaben und verbergen des Panel Arbeit   ( Panel Arbeit ist ein zusätzlichen Panel, auf dem verschiedene TEdit-Komponenten platziert sind)
.     
.       Hauptformular.PAuftrag.Visible := false;
.       Auftrag_Eingaben_verwerfen;
.     end;
 

Das Hilfspanel "Arbeit" verschwindet und die Daten stehen im Array, sogar an der richtigen Stelle.
Das Array soll mit den Spalte, deren Felder auf visible = true gesetzt wurden, auf dem Panel "Arbeitsblatt erscheinen.

Aber das tun sie nicht !!!

Könnte es sein, dass mein Array soweit im Hintergrund gezeigt wird und wie bekomme ich es in den Vordergrund ???
Denn da ist es auf jeden Fall.
Kann ich zur Laufzeit die Z-Reihenfolge ändern und sie vielleicht so nach vorne bringen ?

Vielen Dank für Eure Geduld - ich bin schon ein schwieriger Fall :wink: :oops:
Zuletzt geändert von Lori am Di 14. Feb 2017, 17:32, insgesamt 1-mal geändert.
Grund: Highlighter

BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

Jole hat geschrieben:Ausgehend von deiner Frage, nehme ich an, dass du Labels zur Laufzeit erzeugen und Anzeigen willst. Oder?

Vielleicht hast du aber auch noch irgentwo das .Parent:= ... vergessen?


Genau das war es --- :lol: :lol: :lol: --- Habe >> Parent := PArbeitsblatt<< in der Initialisierung mit aufgeführt und schwups - die Ausgabe kommt.

Danke für Eure Hilfe :oops:

Bernd

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von Mathias »

Ohne ein Visible:= True, wird das nie Angezeigt. Vielleicht hast du aber auch noch irgentwo das .Parent:= ... vergessen?
Du hast in der neusten Source wieder das Parent vergessen.


Wieso nimmst du

Code: Alles auswählen

procedure IniArbeitsblatt;
nicht in die Form-Klasse ?

Siehe meinen Anhang, so wie man dies elegant löst.
Dort werden Labels und Edits dynamisch erzeugt.
Das dort auch Edit sind, kann egal sein, aber das Beispiel zeit gut wie man auf dynamische Elemente zugreift.
Dateianhänge
Edit_und_Label_Dynamsch.zip
(125.34 KiB) 60-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

BernhardDEL
Beiträge: 36
Registriert: Di 31. Jan 2017, 17:18

Re: Probleme beim Initialisieren von Array of TLabel

Beitrag von BernhardDEL »

Danke Mathias, ich werde mir das bei Gelegenheit anschauen und später das dann einpflegen.
Im Moment klappt es ja und ich will an anderer Stelle weiter machen. Irgendwann sollte das Programm ja
nutzbar sein - spätestens wenn ich wieder gesund bin und ans Fahren komme.

Aber, das kann ich sagen, es macht wieder Spaß und für Eure Hilfe bin ich dankbar.
Wenn ich dann in ca. zwei Jahren in Rente gehe, dann kann ich was tun und bin auch ein wenig besser.

Danke nochmals und wenn ich wieder Hilfe brauche, dann melde ich mich. :D

Bernhard

Antworten