![]() |
Wiederholtes Problem - BD7 vergißt Variableninhalte
Große Mecker über Delphi7 und große Frage an Euch
zum wiederholten Male Ich habe in einer Komponente eine procedure, in der (globale) Variablen einen Wert haben, und in einer Procedure dahinter, in der diese Variablen plötzlich keinen Wert mehr haben.
Delphi-Quellcode:
aufgerufen werden die Funktionen der Komponenten dieses Units im Hauptprogramm wie folgt:
unit DiffBild;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+ dieses ist eine Komponente //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ interface uses Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics, EB_Mathe; type TDiffMat =record PixHeight : integer; PixWidth : integer; PixSize : single; SizeHeight : single; SizeWidth : single; Dat : TMatrix; //array of array of single; rangeMat : array of array of boolean; end; TDiffBild = class(TPaintBox) private Pix : integer; wSize, hSize : single; cF : integer; protected public Plan : TDiffMat; Film : TDiffMat; Diff : TDiffMat; globDiff : TDiffMat; lokDiff : TDiffMat; globGamma: TDiffMat; lokGamma : TDiffMat; fs: array[0..17] of TFarbScala; pMax : single; fMax : single; published procedure Initialisieren(PixWeit,PixHoch : integer; SizeWeit, SizeHoch, PixSize:single); procedure Bild(vx,vy:integer;Schwelle:single); procedure globDiffBild(vx,vy:integer;Schwelle:single); procedure lokDiffBild(vx,vy:integer;Schwelle:single); end; procedure Register; //############################################################################## implementation //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TDiffBild.Initialisieren(PixWeit,PixHoch : integer; SizeWeit, SizeHoch, PixSize:single); var i : integer; zwischen : single; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin // hier werden alle Matrixgrößen festgelegt Plan.PixHeight := PixHoch; Plan.PixWidth := PixWeit; Plan.PixSize := PixSize; Plan.SizeHeight:= SizeHoch; Plan.SizeWidth := SizeWeit; SetLength(Plan.Dat,PixWeit+3,PixHoch+3); Film.PixHeight := PixHoch; Film.PixWidth := PixWeit; Film.PixSize := PixSize; Film.SizeHeight:= SizeHoch; Film.SizeWidth := SizeWeit; SetLength(Film.Dat,PixWeit+3,PixHoch+3); // Pixelgröße und Pixellage bestimmen PixSize:=(SizeWeit/PixWeit+SizeHoch/PixHoch)/2; Film.PixSize :=PixSize; cF := 1 + 256 + 256*256; SetLength(Diff.Dat,PixWeit+3,PixHoch+3); SetLength(globDiff.Dat,PixWeit+3,PixHoch+3); SetLength(lokDiff.Dat,PixWeit+3,PixHoch+3); end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TDiffBild.Bild(vx,vy:integer;Schwelle:single); var i, j, k : integer; Maximum : single; zwischen : single; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin canvas.Pen.Mode:=pmCopy; // BildMalen for j := 1 to Film.PixHeight do // ** hier haben alle Variablen noch ihren Wert begin for i := 1 to Film.PixWidth do begin Diff.Dat[i,j]:=Film.Dat[i-vx,j-vy]- Plan.Dat[i-vx,j-vy]; Canvas.Pixels[i,j]:=Diff.Dat[i,j]; end; end; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TDiffBild.globDiffBild(vx,vy:integer;Schwelle:single); var i, j, k : integer; Maximum : single; zwischen : single; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin canvas.Pen.Mode:=pmCopy; // BildMalen for j := 1 to Film.PixHeight do // ** und hier haben Film.PixHeight, Plan.Dat[i,j] ... begin // ** KEINEN Wert mehr! for i := 1 to Film.PixWidth do begin globDiff.Dat[i,j]:=Film.Dat[i-vx,j-vy] - Plan.Dat[i,j]; Canvas.Pixels[i,j]:=globDiff.Dat[i,j]; end; end; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure Register; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin RegisterComponents('EB_Graph', [TDiffBild]); end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ end.
Delphi-Quellcode:
die Funktionen stehen im Hauptprogrann sogar tatsächlich hintereinander, sodaß zwischenzeitlich mit den Variablen nichts geschehen kann.
...
DiffBild1.Initialisieren(512,512; 400, 400, 1); DiffBild1.Bild(1, 1, 0.5); DiffBild1.globDiffBild(1, 1, 0.5); ... Gibt es solche Effekte in Delphi und wie kann man dagegen vorgehen? Danke E. B. |
Re: Wiederholtes Problem mit BD7
sorry aber der Titel ist nicht sehr hilfreich. Please Edit it.
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Meine Glaskugel ist leider gerade in Reparatur. Aber vielleicht kannst du mir ja den Fehler sagen?
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
den Fehler muß ja nicht ich gemacht haben
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Zitat:
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
also ein Bekannter hat mal 10 Bytes in ne 4 Byte Variable reingeschrieben und sich gewundert, warum in der Variable die danach deklariert wurde so ein mist stand :gruebel: überschreibst du die vielleicht irgendwie auf diese Art?
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Damit ihr mir glaubt und ich keinen Quatsch erzähle habe ich folgenden Beweis angetreten, ich habe die erste funktionierende Funktion nochmal hinten angehangen
Delphi-Quellcode:
...
DiffBild1.Initialisieren(512,512; 400, 400, 1); DiffBild1.Bild(1, 1, 0.5); // * hier sind die globalen Variablen da DiffBild1.globDiffBild(1, 1, 0.5); // * hier sind die globalen Variablen weg DiffBild1.Bild(1, 1, 0.5); // * und hier sind die globalen Variablen wieder da ... und diese geht wieder - als ob die berüchtigten globalen Variablen lokal wären irgendwie komisch. Solche Effekte hatte ich schon mal, das globale Inhalte einfach weg waren. Da konnte ich nach Langem Probieren nur lokale Variablen mit elenden langen und komplizierten Parameterlisten stricken - manchmal war es sogar einfacher, Spaghettis zu programmieren--Frust!!! Gruß E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Moin E.B.,
nur um einmal die Begrifflichkeit zu klären: Du verwendest da auch keine globalen Variablen, sondern Felder einer Klasse (die man allerdings i.d.R. unter private deklariert, und dann als property unter public zugänglich macht ;-)) |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Ist das Dein ganzer Quelltext? Ich hab mal ein Mini-Projekt damit gebastelt, bei mir sind Film.PixHeight und PixWidth überall definiert.
Sonst häng mal ein kompilierendes Projekt an. Gruß, teebee |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Ich würde auch mal die öffentlichen Deklarationen von Film etc in der Klasse in den Private Abschnitt verschieben. Wenn man dann versucht zu kompilieren, dann sollte der Compiler einem auf alle Stellen stossen, wo man von aussen auf diese Variablen zugreift.
Andere Möglichkeit wäre es diese als Property zu deklarieren und die Variablen selber im Private Abschnitt. Ein Brechpunkt in der Set-Routine gibt einem dann über den Call Stack recht schnell eine Übersicht, wo falsch darauf zu gegriffen wird. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Ja, zur Begrifflichkeit - warum mache ich das so?
Mit den Komponenten liefere ich mit auch gleich die Variablen. Im Hauptprogramm brauche ich dann keine Variablen mehr deklarieren mit Ausnahme der Integers für For-Schleifen und sonstigen Indices. Bin bisher damit ganz schön weit gekommen und kann kurze Codes erzeugen. Mittlerweile programmiere ich um die 15 Jahre - völliger Autodidakt - also arbeite mit einen ziemlich eigenwilligen Stil. Ihr mögt annehmen - nach 15 Jahren hat der Blödmann immer noch nichts kapiert - mach sein. Dann gebt mir das Geld und Zeit, Programmierkurse zu besuchen. Bin ja lernwillig Danke und Grüße E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Zitat:
Grundsätzlich wäre aber trotz allem eine saubere Trennung hier von Vorteil. Schon allein in dem aktuellen Problemfall zeigt es sich, das man damit wohl leichter zu einer Lösung kommen würde. Wir wollen dir hier bestimmt nicht alles anders vorschreiben als du es kennst, aber wir machen es auch nicht aus Spass daran dich zur Verzweiflung zu treiben sondern Erfahrungen von früheren Situationen etc. haben es uns gelehrt. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Danke danke,
ich bin dankbar und angewiesen auf Eure Hilfe, nochmals vielen Dank. Ich hatte nur plötzlich das Gefühl, als Dümmst Anzunehmender User dazustehen. Habe eben so meinen eigenen Stil entwickelt - bin aber ständig bestrebt, bessr zu werden und dazuzulernen - bin eben zu ungeduldig. Mal ein kleiner Blick auf ![]() Na dann ein schönes Wochende EccoBravo |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Und schonmal probiert die öffentlichen TDiffMat in den Private Bereich zu verschieben und umzubenennen um dann Properties mit den alten Namen zu deklarieren? Dann kannst du in den Set-Methoden doch schonmal rausbekommen ob und wann die Matrix bzw. die Werte überschrieben werden.
Grundsätzlich vergisst Delphi keine Variablen. Ich könnte mir auch an anderer Stelle einen falschen Speicherzugriff vorstellen der die Daten zerstört. Das würde ich im nächsten Schritt dann als ersten mal mit FastMM4 überprüfen. Zuerst aber mal die Properties. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo.
Die Vermutung liegt nahe, dass der Aufruf von Bild() die unerwarteten Werte in die Variablen einträgt. Mit einem black box test kannst du diese Vermutung widerlegen oder du hast den Fehler grob lokalisiert:
Delphi-Quellcode:
Übrigens habe ich nirgends entdecken können, was du mit "haben keinen Wert mehr" aussagen möchtest. Sind alle Inhalte 0? Eventuell hast du irgendwo zwischendurch den Konstruktor aufgerufen?
DiffBild1.Initialisieren(512,512; 400, 400, 1);
// DiffBild1.Bild(1, 1, 0.5); DiffBild1.globDiffBild(1, 1, 0.5); DiffBild1.Bild(1, 1, 0.5); Aus der Nichtbenutzung u.a. des Parameter Schwelle schließe ich, dass du nicht den vollständigen Code zeigst. Nach einem Besuch deiner web site kann ich mir Gründe dafür vorstellen. Im sichtbaren Teil des Codes solltest du auf jeden Fall die Laufvariablen der Schleifen auf die Array-Grenzen anpassen. Low() und High() sind die Funktionen, die dir garantieren, dass du nicht außerhalb der Arraygrenzen zugreifst. Grüße vom marabu |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo EccoBravo,
der Fehler tritt wahrscheinlich auf, weil Du auf nicht vorhandene Arrayelemente zugreifst. Dynamische Arrays sind immer 0-basiert, Du benutzt jedoch beim Lesen und Schreiben den Indexbereich 1..n. Gruß Hawkeye [edit]oops, fast zeitgleich mit marabu :lol: [/edit] |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Will versuchen, DiffMat etc in private zu verschieben und mit property darauf zugreifen. Bei einfachen Werten ist mir das ja geläufig, aber wie mache ich das mit
read und write eines array of array of single im property? Danke E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo E.,
du wirst eine Unit EBTypes haben:
Delphi-Quellcode:
Der Rest geht so wie in der Online-Hilfe beschrieben:
unit EBTypes;
interface type TMatrix = array of array of Extended;
Delphi-Quellcode:
Grüße vom marabu
uses
// ... EBTypes; interface type TDemoForm = class(TForm) // ... private FMatrix: TMatrix; function GetMatrix(iCol, iRow: Integer): Extended; procedure SetMatrix(iCol, iRow: Integer; eValue: Extended); // ... public property Matrix[iCol, iRow: Integer]: Extended read GetMatrix write SetMatrix; end; implementation function TDemoForm.GetMatrix(iCol, iRow: Integer): Extended; begin Result := FMatrix[iCol, iRow]; end; procedure TDemoForm.SetMatrix(iCol, iRow: Integer; eValue: Extended); begin FMatrix[iCol, iRow] := eValue; end; |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo, ich bins nochmal,
habe eben versucht, die Arrays in der Komponente private zu machen und über property zuzugreifen
Delphi-Quellcode:
mit dem Ergebnis, wenn ich ein privates Array schreiben will, kommt der Compilerfehler "Der linken Seite kann nichts zugewiesen werden"
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ interface uses Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics, EB_Mathe; type // TMatrix = array of array of single; TDiffMat =record PixHeight : integer; PixWidth : integer; PixSize : single; SizeHeight : single; SizeWidth : single; Dat : TMatrix; //array of array of single; rangeMat : array of array of boolean; end; TDiffBild = class(TPaintBox) private Pix : integer; wSize, hSize : single; cF : integer; privPlan : TDiffMat; privFilm : TDiffMat; privDiff : TDiffMat; privGlobDiff : TDiffMat; privLokDiff : TDiffMat; privGlobGamma: TDiffMat; privLokGamma : TDiffMat; privHoch : integer; privWeit : integer; function getPlan : TDiffMat; procedure setPlan(Wert:TDiffMat); function getFilm : TDiffMat; procedure setFilm(Wert:TDiffMat); function getLokDiff : TDiffMat; procedure setLokDiff(Wert:TDiffMat); function getGlobDiff : TDiffMat; procedure setGlobDiff(Wert:TDiffMat); function getLokGamma : TDiffMat; procedure setLokGamma(Wert:TDiffMat); function getGlobGamma : TDiffMat; procedure setGlobGamma(Wert:TDiffMat); protected public published property Plan : TDiffMat Read GetPlan Write SetPlan; property Film : TDiffMat Read GetFilm Write SetFilm; property globalDiff : TDiffMat Read GetGlobDiff Write SetGlobDiff; property lokalDiff : TDiffMat Read GetLokDiff Write SetLokDiff; property globalGamma : TDiffMat Read GetGlobGamma Write SetGlobGamma; property lokalGamma : TDiffMat Read GetLokGamma Write SetLokGamma; procedure Initialisieren(PixWeit,PixHoch : integer; SizeWeit, SizeHoch, PixSize:single); procedure Bild(vx,vy:integer;Schwelle:single); procedure globDiffBild(Schwelle:single); end; procedure Register; //############################################################################## implementation //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getPlan : TDiffMat; begin Result.Dat:=privPlan.Dat; end; procedure TDiffBild.setPlan(Wert:TDiffMat); begin privPlan.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getFilm : TDiffMat; begin Result.Dat:=privFilm.Dat; end; procedure TDiffBild.setFilm(Wert:TDiffMat); begin privFilm.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getGlobDiff : TDiffMat; begin Result.Dat:=privGlobDiff.Dat; end; procedure TDiffBild.setGlobDiff(Wert:TDiffMat); begin privGlobDiff.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getLokDiff : TDiffMat; begin Result.Dat:=PrivLokDiff.Dat; end; procedure TDiffBild.setLokDiff(Wert:TDiffMat); begin privLokDiff.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getGlobGamma : TDiffMat; begin Result.Dat:=privGlobGamma.Dat; end; procedure TDiffBild.setGlobGamma(Wert:TDiffMat); begin privGlobGamma.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getLokGamma : TDiffMat; begin Result.Dat:=privLokGamma.Dat; end; procedure TDiffBild.setLokGamma(Wert:TDiffMat); begin privLokGamma.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Habe ich mir doch gedacht - was nun sprach der Zauberer Kann man da noch helfen? Danke E. B. nDAU |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Tut mir leid, aber ich hatte zwei Zeilen nicht mit in die Demo kopiert - habe es aber nachgebessert.
marabu |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo,
erst mal Danke für die intensive Anteilnahme und Hilfe. Ich habe versucht, alle Eure Bedenken zu berücksichtigen und zu probieren. Ich würde schon an mir zweifeln, wenn ich aus meiner Erfahrung wüßte, dieses selbst verbrockt zu haben. Solch Problem hatte ich in der Vergangenheit schon einige Male, und habe dann nach verzweifelter Suche das Problem mit GurkenCode umschifft - kein Stil aber ? .. Ja, was macht Delphi: (dazu habe ich den neuen Code eingefügt)
Delphi-Quellcode:
In der gemeinten Komponente sind Variablen und Arrays private deklariert. Dieses funktioniert auch in allen procedures und functions, nur nicht in einer:
unit DiffBild;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+ //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ interface uses Windows, SysUtils, Classes, Controls, ExtCtrls, Graphics, EB_Mathe; type TFarbScala = record von : string; bis : string; Text:string; r : integer; g : integer; b : integer; i : integer; end; // TMatrix = array of array of single; TDiffMat =record PixHeight : integer; PixWidth : integer; PixSize : single; SizeHeight : single; SizeWidth : single; Dat : TMatrix; //array of array of single; farbe : TkMatrix; end; TDiffBild = class(TPaintBox) private wSize, hSize : single; cF : integer; privPlan : TDiffMat; privFilm : TDiffMat; privDiff : TDiffMat; privGlobDiff : TDiffMat; privLokDiff : TDiffMat; privGlobGamma: TDiffMat; privLokGamma : TDiffMat; privVX : integer; privVY : integer; privMaximum : single; function getPixHoch : integer; procedure setPixHoch(Wert:integer); function getPixWeit : integer; procedure setPixWeit(Wert:integer); function getSizeHoch : single; procedure setSizeHoch(Wert:single); function getSizeWeit : single; procedure setSizeWeit(Wert:single); function getPixSize : single; procedure setPixSize(Wert:single); function getPlan : TDiffMat; procedure setPlan(Wert:TDiffMat); function getFilm : TDiffMat; procedure setFilm(Wert:TDiffMat); function getLokDiff : TDiffMat; procedure setLokDiff(Wert:TDiffMat); function getGlobDiff : TDiffMat; procedure setGlobDiff(Wert:TDiffMat); function getLokGamma : TDiffMat; procedure setLokGamma(Wert:TDiffMat); function getGlobGamma : TDiffMat; procedure setGlobGamma(Wert:TDiffMat); protected public dPlan : TDiffMat; dFilm : TDiffMat; fs: array[0..17] of TFarbScala; published property rPixHoch : integer Read GetPixHoch Write SetPixHoch; property rPixWeit : integer Read GetPixWeit Write SetPixWeit; property rSizeHoch : single Read GetSizeHoch Write SetSizeHoch; property rSizeWeit : single Read GetSizeWeit Write SetSizeWeit; property rPixSize : single Read GetPixSize Write SetPixSize; property Plan : TDiffMat Read GetPlan Write SetPlan; property Film : TDiffMat Read GetFilm Write SetFilm; property globalDiff : TDiffMat Read GetGlobDiff Write SetGlobDiff; property lokalDiff : TDiffMat Read GetLokDiff Write SetLokDiff; property globalGamma : TDiffMat Read GetGlobGamma Write SetGlobGamma; property lokalGamma : TDiffMat Read GetLokGamma Write SetLokGamma; procedure Initialisieren(PixWeit,PixHoch : integer; SizeWeit, SizeHoch, PixSize:single); procedure Bild(vx,vy:integer;Schwelle:single); procedure globDiffBild(Schwelle:single); end; procedure Register; //############################################################################## implementation //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getPixHoch : integer; begin Result:=privPlan.PixHeight; end; procedure TDiffBild.setPixHoch(Wert:integer); begin privPlan.PixHeight:=Wert; privFilm.PixHeight:=Wert; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getPixWeit : integer; begin Result:=privPlan.PixWidth; end; procedure TDiffBild.setPixWeit(Wert:integer); begin privPlan.PixWidth:=Wert; privFilm.PixWidth:=Wert; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getSizeHoch : single; begin Result:=privPlan.SizeHeight; end; procedure TDiffBild.setSizeHoch(Wert:single); begin privPlan.SizeHeight:=Wert; privFilm.SizeHeight:=Wert; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getSizeWeit : single; begin Result:=privPlan.SizeWidth; end; procedure TDiffBild.setSizeWeit(Wert:single); begin privPlan.SizeWidth:= Wert; privFilm.SizeWidth:= Wert; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getPixSize : single; begin Result:=privPlan.PixSize; end; procedure TDiffBild.setPixSize(Wert:single); begin privPlan.PixSize:=Wert; privFilm.PixSize:=Wert; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getPlan : TDiffMat; begin Result.Dat:=privPlan.Dat; end; procedure TDiffBild.setPlan(Wert:TDiffMat); begin privPlan.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getFilm : TDiffMat; begin Result.Dat:=privFilm.Dat; end; procedure TDiffBild.setFilm(Wert:TDiffMat); begin privFilm.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getGlobDiff : TDiffMat; begin Result.Dat:=privGlobDiff.Dat; end; procedure TDiffBild.setGlobDiff(Wert:TDiffMat); begin privGlobDiff.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getLokDiff : TDiffMat; begin Result.Dat:=PrivLokDiff.Dat; end; procedure TDiffBild.setLokDiff(Wert:TDiffMat); begin privLokDiff.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getGlobGamma : TDiffMat; begin Result.Dat:=privGlobGamma.Dat; end; procedure TDiffBild.setGlobGamma(Wert:TDiffMat); begin privGlobGamma.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function TDiffBild.getLokGamma : TDiffMat; begin Result.Dat:=privLokGamma.Dat; end; procedure TDiffBild.setLokGamma(Wert:TDiffMat); begin privLokGamma.Dat:=Wert.Dat; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TDiffBild.Initialisieren(PixWeit,PixHoch : integer; SizeWeit, SizeHoch, PixSize:single); var i : integer; zwischen : single; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin cF := 1 + 256 + 256*256; // Pixelgröße und Pixellage bestimmen PixSize:=(SizeWeit/PixWeit+SizeHoch/PixHoch)/2; // das sind die Abmessungen der Filmenmatrix privPlan.PixHeight := PixHoch; privPlan.PixWidth := PixWeit; privPlan.PixSize := PixSize; privPlan.SizeHeight:= SizeHoch; privPlan.SizeWidth := SizeWeit; privPlan.PixSize := PixSize; SetLength(privPlan.Dat,PixWeit+3,PixHoch+3); SetLength(privPlan.farbe,PixWeit+3,PixHoch+3); // das sind die Abmessungen der Filmenmatrix privFilm.PixHeight := PixHoch; privFilm.PixWidth := PixWeit; privFilm.PixSize := PixSize; privFilm.SizeHeight:= SizeHoch; privFilm.SizeWidth := SizeWeit; privFilm.PixSize := PixSize; SetLength(privFilm.Dat,PixWeit+3,PixHoch+3); SetLength(privFilm.farbe,PixWeit+3,PixHoch+3); // das sind die Abmessungen der lokDiff privLokDiff.PixHeight := PixHoch; privLokDiff.PixWidth := PixWeit; privLokDiff.PixSize := PixSize; privLokDiff.SizeHeight:= SizeHoch; privLokDiff.SizeWidth := SizeWeit; privLokDiff.PixSize := PixSize; SetLength(privLokDiff.Dat,PixWeit+3,PixHoch+3); SetLength(privLokDiff.farbe,PixWeit+3,PixHoch+3); // das sind die Abmessungen der globDiff privGlobDiff.PixHeight := PixHoch; privGlobDiff.PixWidth := PixWeit; privGlobDiff.PixSize := PixSize; privGlobDiff.SizeHeight:= SizeHoch; privGlobDiff.SizeWidth := SizeWeit; privGlobDiff.PixSize := PixSize; SetLength(privGlobDiff.Dat,PixWeit+3,PixHoch+3); // * hier werden die SetLength(privGlobDiff.farbe,PixWeit+3,PixHoch+3); // einzelnen Arrays // längendimensioniert // das sind die Abmessungen der lokDiff privLokGamma.PixHeight := PixHoch; privLokGamma.PixWidth := PixWeit; privLokGamma.PixSize := PixSize; privLokGamma.SizeHeight:= SizeHoch; privLokGamma.SizeWidth := SizeWeit; privLokGamma.PixSize := PixSize; SetLength(privLokGamma.Dat,PixWeit+3,PixHoch+3); SetLength(privLokGamma.farbe,PixWeit+3,PixHoch+3); // das sind die Abmessungen der globDiff privGlobGamma.PixHeight := PixHoch; privGlobGamma.PixWidth := PixWeit; privGlobGamma.PixSize := PixSize; privGlobGamma.SizeHeight:= SizeHoch; privGlobGamma.SizeWidth := SizeWeit; privGlobGamma.PixSize := PixSize; SetLength(privGlobGamma.Dat,PixWeit+3,PixHoch+3); SetLength(privGlobGamma.farbe,PixWeit+3,PixHoch+3); end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TDiffBild.Bild(vx,vy:integer;Schwelle:single); var i, j, k : integer; zwischen : single; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin privVx:=vx; privVy:=vy; // * hier funktioniert noch alles canvas.Pen.Mode:=pmCopy; // wunderbar // Max vom Plan bestimmen privMaximum:= MatrixMax(privPlan.PixWidth,privPlan.PixHeight,privPlan.Dat); // BildMalen setlength(privGlobDiff.farbe,555,555); for j := 1 to privPlan.PixHeight do begin for i := 1 to privPlan.PixWidth do begin if (i-vx<1) or (i-vx>privPlan.PixWidth) or (j+vy<1)or (j+vy>privPlan.PixHeight) then begin zwischen :=0; end else zwischen :=(privFilm.Dat[i-vx,j+vy]-privPlan.Dat[i,j])/privMaximum*100; if zwischen < StrToFloat(fs[17].bis) then k := 17 else if zwischen < StrToFloat(fs[16].bis) then k := 16 else if zwischen < StrToFloat(fs[15].bis) then k := 15 else if zwischen < StrToFloat(fs[14].bis) then k := 14 else if zwischen < StrToFloat(fs[13].bis) then k := 13 else if zwischen < StrToFloat(fs[12].bis) then k := 12 else if zwischen < StrToFloat(fs[11].bis) then k := 11 else if zwischen < StrToFloat(fs[10].bis) then k := 10 else if zwischen < StrToFloat(fs[9].bis) then k := 9 else if zwischen < StrToFloat(fs[8].bis) then k := 8 else if zwischen < StrToFloat(fs[7].bis) then k := 7 else if zwischen < StrToFloat(fs[6].bis) then k := 6 else if zwischen < StrToFloat(fs[5].bis) then k := 5 else if zwischen < StrToFloat(fs[4].bis) then k := 4 else if zwischen < StrToFloat(fs[3].bis) then k := 3 else if zwischen < StrToFloat(fs[2].bis) then k := 2 else if zwischen < StrToFloat(fs[1].bis) then k := 1; if Plan.Dat[i,j]<Schwelle then begin k :=0; privGlobDiff.Dat[i,j]:=0; end else begin privGlobDiff.Dat[i,j]:=zwischen; end; privGlobDiff.farbe[i,j]:=k; // * das Array // privGlobDiff.farbe // ist noch sauber // definiert Canvas.Pixels[i,j]:=RGB(fs[k].r,fs[k].g,fs[k].b); end; end; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TDiffBild.globDiffBild(Schwelle:single); // * dieses ist die var // Problemprocedure !!! i, j, k : integer; zwischen : single; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin // setlength(privGlobDiff.farbe,555,555); // * nur hier läßt sich die for j := 1 to 256 do // Längendimensionierung begin // wieder herstellen for i := 1 to 256 do // aber alle Zelleninhalte dann = 0 begin privGlobDiff.farbe[2*i,2*j]; // * die Längendimensionierung // von privGlobDiff.farbe // ist verschwunden Canvas.Pixels[i,j]:=RGB(fs[k].r,fs[k].g,fs[k].b); end; end; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure Register; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ begin RegisterComponents('EB_Graph', [TDiffBild]); end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ end. Dort sind die iprocedures und functionsntegers und singles = 0, die Strings ='' und die dynamischen Arrays, vorher in anderen procedures und functions mit setLength längendimensioniert, mit der Länge 0 oder 1. Und genau dieses habe ich wieder in diesem Falle. In dem besagten procedure ist die Länge des arrays / der Arrays = 0, obgleich sie vorher in einer anderen procedure mit 512, 512 dimensioniert wurde. Ich habe versucht, die setLength(array,512,512) funktion noch in anderen procedures ausführen zu lassen - aber ohne Erfolg. Das provate 'globale' array ließ sich für die besagte procedure nur in dieser selber längendimensionieren, also die besagte arraylänge im fehlerhaften procedure war nur dann von 0/1 verschieden, wenn ich diese indieser procedure selbst dimensioniert habe - setLength ließ sich nur lokal anwenden. Am Rande erwähnt,Constructors uä verwende ich in diesem Programm nicht. Nach 15 Jahren Programmiererfahrungen, wiederholtem Auftreten dieses Problems und tiefgründiger Prüfung kann ich in diesem Falle wohl annehmen, sauber und konsistent programmiert zu haben, und darf wohl behaupten, daß mich wohl da der Compiler ärgert. D.h. das Problem ist mir seit längerem bekannt, seine Ursachen und die Lösung noch nicht. Einer meiner Vorredner hat wohl mit der "kaputten Glaskugel" recht - nur war das wohl nicht seine Glaskugel. In Hoffnung auf Problemlösung und Verständnis E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Diese eine Methode, welche immer eine Länge von 0 hat, auf welche Deklaration der Variablen greift er zu? Also am besten das Projekt in Delphi öffnen und in einer funktinierenden und in der fehlerhaften Procedure mal auf die Variable(Array) einen Rechtsklick machen und "Deklaration suchen" ausführen. Dann vergleich, ob beide Methoden auf die gleiche Deklaration zurück greifen.
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo, greift auf die selbe Deklaration zu
Danke E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
soeben eine interessante Beobachtung gemacht:
Die einzelnen procedure TDiffBild kennen nicht alle anderen procedures der Komponente. Wenn ich mit demPunkt nach TDiffBild, also TDiffBild'.' mir die Auswahl der bekannten procedures dieses Objektes anschaue bekomme ich folgendes Ergebnis:
Delphi-Quellcode:
usw usf
bei procedure TDiffBild. .globDiffBild .SetGlobGamma(wert:TDiffMat)
.globDiffBild bei procedure TDiffBild. .Bild(..) .SetGlobGamma(wert:TDiffMat) .Bild(vx:integer, vy:integer;Schwelle:single) .globDiffBild bei procedure TDiffBild. .Initialisieren(..) .SetGlobGamma(wert:TDiffMat) .Initialisieren(..) .Bild(vx:integer, vy:integer;Schwelle:single) .globDiffBild bei procedure TDiffBild. .setLokGamma(..) .SetLokGamma(wert:TDiffMat) .SetGlobGamma(wert:TDiffMat) .Initialisieren(..) .Bild(vx:integer, vy:integer;Schwelle:single) .globDiffBild Mit diesem Fehler dürfte sich mein anderer Fehler, (daß er Variablen und Werte in einer Procedure verliert) erklären. Delphi kennt nur die Variablen-Bearbeitungschritte der Proceduren, welche er auch kennt. Wenn die Procedure .globDiffBild die procedure .Initialisieren nicht kennt, sind für diese .globDiffBild die Arrays auch nicht dimensioniert (die Dimensionierung erfolgt nämlich in .Initialisieren). Soweit alles klar! AAbbeerr warum kennt eine Komponentenprocedure nicht alle anderen Proceduren sondern jede procedure ein paar davon und jedesmal andere ?????????? Eigentlich müßten für alleprocedure alle anderen procedures der Komponente immer sichtbar / bekannt sein. Vielleicht ist diese Beobachtung aufschlußreich Danke E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
vielleicht noch ein kleiner Tip:
vei functions ist die Sichtbarkeit in der Autovervollständigung auf den Zuweisungstyp der function eingeschränkt, bei procedures nicht. Grüße E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Frage:
gibt es Compilerdirektiven, die an diesem Fehler angreifen können? Danke E. B. |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Was für ein Fehler? Wenn s als String deklariert ist, warum sollte er dir dann eine Funktion anbieten, die einen Integer zurückgibt? Wenn ich zu einem Reifenhändler fahre und im sage, dass ich neue Reifen für meinen PKW brauche, dann zeigt der Verkäufer mir auch seine tollen LKW Reifen.
|
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo Ecco,
das von dir beobachtete Phänomen im Zusammenhang mit Code Insight würde ich nicht als Fehler ansehen. Dein eigentliches Problem solltest du vielleicht so isolieren, dass du es als kompilierbares und lauffähiges Projekt bereit stellen kannst. Ich denke, dass der Fehler dann schnell behoben werden kann. Ich vermute, dass deine Bild-Dimensionen eine Rolle spielen. Grüße vom marabu |
Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
Hallo,
bin immer noch am Prüfen. im problembehafteten Procedure vergißt er nicht nur die Dimensionierung der arrays, sonern er vergißt den Inhalt ALLER "global" private deklarierten Variablen. E. B. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz