![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 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