Autor Beitrag
DietmarS
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.05.06 00:51 
Hallo,

ich poste hier zum ersten Mal (generell), da dies das erste Mal ist, dass die Suchfunktion mir nicht weiterhelfen kann ;)
Ich verzweifle an folgendem Problem:

Dieses Programm soll eine Liste von Einträgen erstellen. Jeder Eintrag hat im echten Programm mehrere Felder wie 'Name', 'Dauer' ...(deswegen der RECORD). Bei Druck auf den Button wird ein neuer Eintrag ein paar Pixel weiter unten erstellt. Hier das Problem: Der neue Eintrag erscheint wo er erscheinen soll, allerdings verschwindet der Alte oben.

Ich vermute, da die Prozedur von TForm1 stammt, ist das .create(self) auf TForm1 bezogen. Eigendlich müsste es aber auf Plaene[zaehler] bezogen sein. Und dort vermute ich eben den Fehler...

Da TPlan ein Record ist, nimmt es keine Prozeduren auf.


ausblenden Delphi-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:
type TForm1 = class(TForm)
  WertVorgabe : TEdit;                  //// Es existiert eine Grund-Vorlage für dieses Feld, dessen Attribute später übernommen werden
  procedure Auflisten(Sender: TObject);
end;


type type TPlan = RECORD               //// Zur Veranschaulichung nur ein Feld deklariert
  Wert : TEdit; 
end;


VAR
Form1: TForm1;
Plaene : Array[1..100]of TPlan;        //// max. 100 Listeneinträge möglich


procedure TForm1.Auflisten(Sender: TObject);    //// wird durch einen Button beliebig oft ausgelöst
begin

zaehler := zaehler+1;

     with Plaene[zaehler] DO BEGIN
      Wert := TEdit.create(self)  //// Problem: 'self' bezeichnet TForm1 
      Wert := TForm1.WertVorgabe;  //// Attribute von dem Vorlage-Feld werden übernommen
      Wert.top := Wert.Top + 50;
     END

end;


Wäre super, wenn mir einer von euch weiter helfen kann, denn ich bin am Ende meines Lateins.

Gruß
Dietmar

Moderiert von user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von DietmarS am Do 11.05.06 00:01, insgesamt 2-mal bearbeitet
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Mi 10.05.06 01:25 
Statt self kannst du natürlich auch Wert := TLabel.create(Plaene[zaehler]) schreiben und dich darüber freuen, dass der Konstruktor von TLabel eine TComponent und kein Record als Parameter erwartet.
DietmarS Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.05.06 13:59 
Danke für deine Antwort!

Das hab ich natürlich auch schon probiert. Hilft mir aber nicht wirklich weiter. Willst du mir damit vielleicht sagen, dass mein Vorhaben unrealisierbar ist oder so?
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Mi 10.05.06 14:50 
Es geht schon, aber nicht mit dem, entschuldige bitte, Pfusch, den du da fabriziert hast. Du deklarierst z.B. Wert als TEdit, willst ihm dann aber ein TLabel zuweisen. Danach überschreibst du die Variable einfach mit der Referenz auf Wertvorgabe. Was ist "muss" und warum wird es ständig nach unten geschoben?
DietmarS Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.05.06 20:11 
Hast Recht, tut mir leid, als ich das geschrieben hab, war es wohl schon ein wenig spät für meine kleinen grauen Zellen...
Das da oben war ganz totaler Kappes, habs inzwischen verbessert. "Wert" ist und bleibt ein TEdit.

Dass ich die .create(self) Zeile einfach weg lassen hätte können, ist mir nach einem Versuch und dank deiner erstaunten Aussage auch klar geworden ... Problem bleibt aber trotzdem bestehen...

"muss" ist auch sowas, was ich dummerweise einfach reinkopiert habe. Hab es jetzt durch "Wert" ersetzt, wie es sein sollte.

Ich sollte vielleicht endlich mal erwähnen, dass das hier mein erstes einigermaßen umfangreiches Programm außerhalb der Berufsschule ist. Da programmieren wir nur Konsolenanwendungen und lernen ganz langsam die Basics...

Die Variable wird mit den Werten der "WertVorgabe" überschrieben, so muss ich .Left oder die Schriftart nicht neu definieren. Danach wird sie 111 Pixel nach unten gerückt. Im fertigen Programm hab ich auch kleine Bilder, deren Inhalt auch immer neu definiert werden müsste.

Der Link zum Programm: www.terra-anolis.de/YAK.exe
- Gib einfach mal eine Uhrzeit ein, ein paar Koordinaten von -255 - 255 und ein paar Einheiten und klick dann auf Berechnen.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 10.05.06 21:00 
Versuche in Zeile 24 einmal Wert.Assign(Wertvorgabe). Alles andere aus dem obigen Quelltext stimmt soweit (ich das jetzt beurteilen kann).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
DietmarS Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 10.05.06 21:17 
Hey, danke für deine schnelle Antwort!

Habe jetzt folgendes stehen:

with Plaene[zaehler] DO BEGIN
Wert.Assign(Form1.WertVorgabe);


Bekomme jetzt eine Zugriffsverletzung.


Ich verstehe einfach nicht, dass das Feld vom letzten Durchlauf nicht mehr sichtbar ist. Wenn ich eine Überprüfung von Plaene[1].Wert.visible = true mache, erhalte ich auch jedes Mal true.

Da mein Problem anscheinend nichts mit der Überschrift zu tun hatte, markiere ich dieses Thema mal als erledigt ...