Probleme beim Initialisieren von Array of TLabel

Für Fragen von Einsteigern und Programmieranfängern...

Probleme beim Initialisieren von Array of TLabel

Beitragvon BernhardDEL » 13. Feb 2017, 09:22 Probleme beim Initialisieren von Array of TLabel

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

In Zeile 1151 steht dann:
Fehlermeldung1-2.JPG


Wenn ich dann trotzdem das Programm weiter ausführe kommt Meldung Nr.3 :
Debuggerfehler.JPG


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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Lori am 13. Feb 2017, 16:42, insgesamt 1-mal geändert.
Grund: Highlighter
BernhardDEL
 
Beiträge: 36
Registriert: 31. Jan 2017, 17:18

Beitragvon theo » 13. Feb 2017, 09:47 Re: Probleme beim Initialisieren von Array of TLabel

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
theo
 
Beiträge: 7802
Registriert: 11. Sep 2006, 18:01

Beitragvon BernhardDEL » 13. Feb 2017, 10:20 Re: Probleme beim Initialisieren von Array of TLabel

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: 31. Jan 2017, 17:18

Beitragvon BernhardDEL » 13. Feb 2017, 12:49 Re: Probleme beim Initialisieren von Array of TLabel

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
BernhardDEL
 
Beiträge: 36
Registriert: 31. Jan 2017, 17:18

Beitragvon Jole » 13. Feb 2017, 13:46 Re: Probleme beim Initialisieren von Array of TLabel

Liegt es vielleicht an dieser Zeile?
Code: Alles auswählen
Arbeitsblatt_Ausgabe[Spalte,Zeile].Visible := false;
Jole
 
Beiträge: 113
Registriert: 4. Jul 2014, 13:39
OS, Lazarus, FPC: Linux | 
CPU-Target: amd64
Nach oben

Beitragvon BernhardDEL » 13. Feb 2017, 14:23 Re: Probleme beim Initialisieren von Array of TLabel

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.
BernhardDEL
 
Beiträge: 36
Registriert: 31. Jan 2017, 17:18

Beitragvon Jole » 13. Feb 2017, 15:11 Re: Probleme beim Initialisieren von Array of TLabel

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?
Jole
 
Beiträge: 113
Registriert: 4. Jul 2014, 13:39
OS, Lazarus, FPC: Linux | 
CPU-Target: amd64
Nach oben

Beitragvon BernhardDEL » 13. Feb 2017, 17:57 Re: Probleme beim Initialisieren von Array of TLabel

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 14. Feb 2017, 17:32, insgesamt 1-mal geändert.
Grund: Highlighter
BernhardDEL
 
Beiträge: 36
Registriert: 31. Jan 2017, 17:18

Beitragvon BernhardDEL » 13. Feb 2017, 18:08 Re: Probleme beim Initialisieren von Array of TLabel

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
BernhardDEL
 
Beiträge: 36
Registriert: 31. Jan 2017, 17:18

Beitragvon Mathias » 13. Feb 2017, 18:08 Re: Probleme beim Initialisieren von Array of TLabel

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2540
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon BernhardDEL » 13. Feb 2017, 22:06 Re: Probleme beim Initialisieren von Array of TLabel

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
BernhardDEL
 
Beiträge: 36
Registriert: 31. Jan 2017, 17:18

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried