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