Delphi-PRAXiS
Seite 1 von 3  1 23      

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 13:22


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:
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.
aufgerufen werden die Funktionen der Komponenten dieses Units im Hauptprogramm wie folgt:

Delphi-Quellcode:
...
DiffBild1.Initialisieren(512,512; 400, 400, 1);
DiffBild1.Bild(1, 1, 0.5);
DiffBild1.globDiffBild(1, 1, 0.5);
...
die Funktionen stehen im Hauptprogrann sogar tatsächlich hintereinander, sodaß zwischenzeitlich mit den Variablen nichts geschehen kann.
Gibt es solche Effekte in Delphi und wie kann man dagegen vorgehen?

Danke

E. B.

TeronG 10. Mär 2006 13:23

Re: Wiederholtes Problem mit BD7
 
sorry aber der Titel ist nicht sehr hilfreich. Please Edit it.

malo 10. Mär 2006 13:46

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
 
Meine Glaskugel ist leider gerade in Reparatur. Aber vielleicht kannst du mir ja den Fehler sagen?

EccoBravo 10. Mär 2006 13:49

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte
 
den Fehler muß ja nicht ich gemacht haben

Luckie 10. Mär 2006 13:53

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

Zitat von EccoBravo
die Funktionen stehen im Hauptprogrann sogar tatsächlich hintereinander, sodaß zwischenzeitlich mit den Variablen nichts geschehen kann.

Und was wird zwischendruch noch alles aufgerufen, was die Vverändern könnte? dass sie im Quelltext direkt hintereinander stehen hat doch nichts mit der Aufrufreihenfolge zu tun. Übrignes ist das wieder ein sehr schönes Beispiel, warum man globale Variablen vermeiden sollte. Ich bin mir ziemlich sicher, dass es kein Bug von Delphi ist, sondern ein Fehler bei dir im Code.

Angel4585 10. Mär 2006 13:59

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?

EccoBravo 10. Mär 2006 14:17

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.

Christian Seehase 10. Mär 2006 14:23

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 ;-))

teebee 10. Mär 2006 14:25

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

Muetze1 10. Mär 2006 14:41

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 03:57 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz