AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wiederholtes Problem - BD7 vergißt Variableninhalte
Thema durchsuchen
Ansicht
Themen-Optionen

Wiederholtes Problem - BD7 vergißt Variableninhalte

Ein Thema von EccoBravo · begonnen am 10. Mär 2006 · letzter Beitrag vom 17. Mär 2006
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#1

Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 14:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von TeronG
TeronG

Registriert seit: 19. Jul 2004
Ort: München
960 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Wiederholtes Problem mit BD7

  Alt 10. Mär 2006, 14:23
sorry aber der Titel ist nicht sehr hilfreich. Please Edit it.
龍 Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#3

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 14:46
Meine Glaskugel ist leider gerade in Reparatur. Aber vielleicht kannst du mir ja den Fehler sagen?
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#4

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 14:49
den Fehler muß ja nicht ich gemacht haben
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 14:53
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 14:59
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 überschreibst du die vielleicht irgendwie auf diese Art?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#7

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 15:17
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 15:23
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 )
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#9

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 15:25
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Wiederholtes Problem - BD7 vergißt Variableninhalte

  Alt 10. Mär 2006, 15:41
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr.
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