![]() |
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:52 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