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



BeitragVerfasst: Do 07.08.08 19:19 
Hallo zusammen,

ich bin relativer newbie (und vielleicht ein wenig naiv) was diese ganze Programmiererei betrifft, vielleicht mache ich also noch irgendwelche grundlegenden Dinge falsch, die ich über Objektorientierung noch nicht verstanden hab oder so. Aber ich versuche mal mein Problem zu schildern ...

Ich habe in Borland Developer Studio 2006 Turbo Delphi ein MDI Programm erstellt. Das Hauptfenster liest über eine Unit Werte aus einer Datei in ein privates array von records ein. Wenn das geklappt hat, kann man mit einem Button ein Child-Window erstellen, welches die Werte aus dem Hauptfenster-array in ein eigenes privates array kopiert (über eine Ausgabefunktion der Hauptfenster-unit). Damit rechnet es über eine weitere Unit Werte aus und speichert diese in einem weiteren privaten array von records. (Dabei sollte ich vielleicht noch erwähnen, dass diese arrays mehrere tausend Elemente besitzen können.) Danach werden die errechneten Werte im Prinzip in dem Child Fenster in einem selbstgestrickten Koordinatensystem dargestellt. Der Inhalt des lokalen arrays mit den Ergebnissen kann dann in einer Datei abgespeichert werden. Soweit funktioniert eigentlich auch alles.

Das Problem was ich nun habe ist, dass sobald ich ein weiteres child Fenster erzeuge, wo wieder etwas neu berechnet werden soll, sich der (grafische) Inhalt aller Fenster ändert. Auch werden die arrays in den anderen Fenstern zumindest teilweise überschrieben. Wie kann ich also die child Fenster voneinander entkoppeln? Kann es sein dass ich Speicherprobleme habe, da gespeicherte arrays anscheinend modifiziert werden sobald man ein neues Fenster öffnet? Ausserdem gibt es bei mehreren Child Fenstern Abstürze (u.a. Stack overflow)

Ich habe im Prinzip 2 verschiedene Methoden probiert die Child Fenster zu erzeugen; zuerst mit einer einzelnen "child:Tchild"-variable und später über ein array: child[i-1]:= Tchild.create(application) oder Application.CreateForm( Tchild, child[i-1]) (der Unterschied ist mir noch nicht ganz klar). Bisher habe ich keinen Unterschied festgestellt, ob ich immer dieselbe Variable nutze oder ein array von child Variablen. Ich habe immer dasselbe Problem.

Im Prinzip erzeuge ich doch Instanzen eines Typs (das Child Window; die Variable des Typs des Child Window's in der entsprechenden Unit habe ich schon ohne Konsequenzen entfernt) - dann sollten doch auch alle Variablen und Objekte unabhängig sein oder sehe ich das falsch? In der child unit steht doch eigentlich nur die Definition und nicht das eignetliche Objekt ...

Vielleicht kann mir ja jemand weiterhelfen
Vielen Dank
Daniel
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Do 07.08.08 19:25 
Das klingt irgendwie alles so als würdest du deine Arrays nicht korrekt aufrufen bzw. auf Bereiche zugreifen, die nicht initialisiert sind. Überprüfe mal deinen Code darauf ob wirklich immer gültige Bereche der Arrays angesprochen werden, und du könnetst auch mal in den Comiler-Optionen die Bereichsprüfung einschalten.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 08.08.08 11:28 
Die Ursachen können vielfältig sein.
Ich vermute, dass mit globalen Variablen gearbeitet wird.
Definiere deine Variablen in der Klasse (z.B. TForm). Dann solltest du vor solchen grundsätzlichen Fehler geschützt sein.

Wenn es kein wichtiges Projekt ist, kannst du es ja auch als Dateianhang zur Verfügung stellen. Dann wird es für uns einfacher.
KaiDaniel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 08.08.08 14:21 
Hallo und danke für die bisherigen Antworten.
Zur Verfügung stellen möchte ich den Code nur ungern ...
Fast alle Variablen sind private in der jeweiligen Form - es werden 2 arrays aus dem Hauptfenster (Form1:TForm1) in das Child Fenster (class(TForm3) ) übergeben über Prozeduren im Hauptfenster - daran kann es meiner Meinung nach nicht liegen.

Um das Child zu erzeugen nutze ich (über eine Proc. TForm1.buttonClick):
ausblenden Delphi-Quelltext
1:
child:= TForm3.create(application); // <- wo sollte die Variable "Child" definiert sein?					

Ich habe im child window stehen:
ausblenden Delphi-Quelltext
1:
2:
AbsLine:=Form1.AbsLineRead; // <- type:array of record
AbsParameters:=Form1.paramread; // <- type:record

"AbsLine" sowie "AbsParameters" sind beides private arrays (Bezeichnungen habe ich jeweils doppelt gewählt für Haupt- und Child-Fenster - sollte aber nicht schaden wegen private, oder?)
Es werden Daten aus dem "AbsLine" array übergeben sowie vom Nutzer einstellbare Parameter über "AbsParameters" aus Form1 in child (TForm3).

Ach ja, wie gesagt ändern sich alle Graphiken - das mache ich über procedures wie z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm3.DrawCoordSystem(m, n:integer; xmin,xmax,ymin,ymax,d:double; xlabel,ylabel:string);
begin
   paintbox1.Canvas.MoveTo(paintx(0), painty(0));
   paintbox1.Canvas.LineTo(paintx(1), painty(0));
   paintbox1.Canvas.LineTo(paintx(1), painty(1));
   paintbox1.Canvas.LineTo(paintx(0), painty(1));
   paintbox1.Canvas.LineTo(paintx(0), painty(0));

   paintbox1.canvas.TextOut(paintx(0.5),painty(-0.1),xlabel);
   paintbox1.canvas.TextOut(paintx(-0.1),painty(0.5),ylabel);

   DrawTicks(m,n,xmin,xmax,ymin,ymax,d);
end;

Wieso werden denn dann alle Fenster gleichzeitig beeinflusst? Die Graphik sollte erstmal relativ unabhängig von den ganzen Variablen sein, denke ich. Muss ich vor alle Befehle noch einen Platzhalter für das aktuelle MDI child window schreiben? TForm3 ist doch erstmal eine allgemeine Klassendefinition und nicht auf eine spezifische Instanz child beschränkt ...

Daniel

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 08.08.08 14:35 
Arbeitest du mit dynamischen Arrays?
Dann kann es bei falscher Übergabe passieren, dass du die Adresse übergibst. Die Folge ist, dass jeder Änderung im Array sich auf alle Fenster auswirkt.
KaiDaniel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 08.08.08 15:44 
user profile iconjasocul hat folgendes geschrieben:
Arbeitest du mit dynamischen Arrays?
Dann kann es bei falscher Übergabe passieren, dass du die Adresse übergibst. Die Folge ist, dass jeder Änderung im Array sich auf alle Fenster auswirkt.


Ja, das tue ich in der Tat ;o)
Ich habe im Hauptfenster eine Funktion

function TForm1.AbsLineRead:TAbsLineArray;
begin
result := AbsLine
end;

zur Übergabe des arrays "Absline", welche ich aus dem Child-Fenster aufrufe. Muss ich mir da also etwas komplizierteres ausdenken? Oder kann ich AbsLine irgendwie "dereferenzieren", so dass die Werte übergeben werden?

Wenn das mein Problem sein sollte, ist mir noch nicht ganz klar, wieso sich alle Ergebnisse ändern, sobald ich mit diesem array gerechnet hab ... die Rechnung wird ja pro Fenster nur einmal durchgeführt, dann müssten die "Ergebnis"-Arrays ja auch aus irgendeinem Grund gekoppelt sein.

Daniel
KaiDaniel Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 08.08.08 16:41 
OKAY :o) Die dynamischen arrays waren tatsächlich das Problem. Ich habe jetzt das Array aus dem Hauptfenster über die copy-Funktion übernommen. Ausserdem waren die Rechenergebnisse doch öffentlich, da ich die in einem Record gespeichert hatte, und die Definition stand unter der Typendefinition des Childwindows (oops)

Vielen Dank für die Mühen, ich komm bestimmt nochmal auf dieses Forum zurück ;o) ...
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 08.08.08 19:20 
Ich mag es, wenn es genügt, auf das mögliche Problem hinzuweisen und sich jemand dann selbst die Mühe macht, seinen Source daraufhin zu prüfen.

Sehr gut Daniel.