Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wiederholtes Problem - BD7 vergißt Variableninhalte (https://www.delphipraxis.net/64961-wiederholtes-problem-bd7-vergisst-variableninhalte.html)

EccoBravo 10. Mär 2006 14:46

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.

Muetze1 10. Mär 2006 15:14

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
 
Zitat:

Zitat von EccoBravo
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.

Selber Autodidakt, nie irgendwelche Kurse besucht aber viel angeschaut und abgeschaut. Vieles macht Sinn und man übernimmt es mit der Zeit. Das Argument Geld und Programmierkurs zählt überhaupt nicht, das habe ich auch ohne diese Dinge in meinen 15 Jahren Programmierung hinbekommen.

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.

EccoBravo 10. Mär 2006 15:54

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 www.eb-dosis.de.
Na dann ein schönes Wochende

EccoBravo

Muetze1 10. Mär 2006 18:49

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.

marabu 10. Mär 2006 19:21

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:
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);
Ü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?

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

Hawkeye219 10. Mär 2006 19:22

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]

EccoBravo 16. Mär 2006 16:32

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.

marabu 16. Mär 2006 17:37

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
 
Hallo E.,

du wirst eine Unit EBTypes haben:

Delphi-Quellcode:
unit EBTypes;
interface
type
  TMatrix = array of array of Extended;
Der Rest geht so wie in der Online-Hilfe beschrieben:

Delphi-Quellcode:
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;
Grüße vom marabu

EccoBravo 16. Mär 2006 17:39

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:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mit dem Ergebnis, wenn ich ein privates Array schreiben will, kommt der Compilerfehler "Der linken Seite kann nichts zugewiesen werden"

Habe ich mir doch gedacht - was nun sprach der Zauberer

Kann man da noch helfen?

Danke E. B.
nDAU

marabu 16. Mär 2006 18:01

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.
Seite 2 von 3     12 3      

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