Autor |
Beitrag |
a.C.k
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Fr 07.03.03 18:26
Hallo,
ich möchte ein Frame bauen, welches sobald es geladen wird, einer Boolischen Variable einen Wert zuweist:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| puplic ... ... Active: boolean; constructor Create(AOwner: TComponent); override; end;
... ...
constructor TFrame.Create(AOwner: TComponent); begin Active := false; inherited;
end; |
So weit so gut. Bis dahin klappt es auch.
Nur wenn ich nun den Wert meiner Variable später im Frame erfragen möchte, dann bekomme ich eine Exception: "Zugriffsverletzung an Speicherstelle ..... ".
Warum das? Ich habe schritt für schritt durchcompiliert. Der Constrictor springt an, sobalt das Formular auf dem mein Frame geladen. Die Variable "Active" bekommt den Wert false zugeschrieben... aber später ist nichts mehr da. Ich verstehe das nicht... Was mache ich falsch  .
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 07.03.03 19:50
Tausch mal die Reihenfolge in Create;
erst den Vorgänger aufrufen. Der sorgt für die korrekte Initialisierung. Dann die Variable setzen.
Nun sollten keine Fehler mehr auftauchen.
Grüße
MSCH
P.S. Active ist per se FALSE. Brauchste also eigentlich nicht setzen.
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mo 10.03.03 15:14
Stimmt, da war ein denkfehler!
Aber leider bleibt das Problem trotzdem bestehen. Der Fehler ist noch immer der selbe 
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 10.03.03 15:29
Hallo
poste mal bitte mehr quelltext
- ist das der ganze constructor
- zeig mal, wie du den Frame erzeugst
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mo 10.03.03 15:34
OK, hier ist er:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| unit frame_AnsprechpartnerListe;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, TFlatStringGridUnit, ExtCtrls, StdCtrls, TFlatMemoUnit, TFlatButtonUnit, tools, st_Ansprech, konsts;
type TFrame_Ansprechpartner = class(TFrame) Panel7: TPanel; btnBearbeiten: TFlatButton; FlatButton2: TFlatButton; FlatButton3: TFlatButton; FlatMemo2: TFlatMemo; Splitter2: TSplitter; SG: TFlatStringGrid; Panel8: TPanel; Panel9: TPanel; FlatButton5: TFlatButton; FlatButton6: TFlatButton; Panel10: TPanel; FlatButton4: TFlatButton; FlatButton7: TFlatButton; procedure SGRowChange(Sender: TObject; row: Integer; var aColor: TColor); procedure btnBearbeitenClick(Sender: TObject); private { Private-Deklarationen } rs : TResultSet; public { Public-Deklarationen } Active: boolean; constructor Create(AOwner: TComponent); override; destructor destroy; override; end;
var Frame_Ansprechpartner : TFrame_Ansprechpartner;
procedure LadeAnsprech(Kunde : Boolean; LNR : String); implementation
uses st_Lieferant; {$R *.dfm} procedure LadeAnsprech(Kunde : Boolean; LNR : String); begin With Frame_Ansprechpartner do begin If Active = false then begin rs := TResultSet.create(app); Active := true; end;
rs.Open('select Nummer, lnr, Anrede=(case geschlecht when ''W'' then ''Frau'' else ''Herr'' end),Nachname=name,'+ ' Vorname=vorname, Telefon=telefon,Telefax=telefax, Email=email, Handy=handy, bemerkung '+ 'from LAnsprec ' + 'where lnr='''+LNR+''' ORDER BY name, vorname',20); rs.MapToGrid(sg); FlatMemo2.Text := sg.Cells[9, sg.row] ; end; end;
constructor TFrame_Ansprechpartner.Create(AOwner: TComponent); begin inherited; Active := false; end;
end. |
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 10.03.03 15:48
und wo erzeugst du den frame?
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mo 10.03.03 16:08
Habe das in einem anderen Formular auf ein Pannel gesetzt.. mehr nicht. Muss ich das noch extra erzeugen?
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 10.03.03 17:37
a.C.k hat folgendes geschrieben: | Habe das in einem anderen Formular auf ein Pannel gesetzt.. mehr nicht. Muss ich das noch extra erzeugen? |
Zitat: |
var Frame_Ansprechpartner : TFrame_Ansprechpartner;
|
hier ist Frame_ansprechpartner global angelegt. und ich gehe von dieser Deklaration davon aus, das du vorhast, den/die Frames erst zur Laufzeit zu erzeugen (kein Problem ,mach ich auch)
Zitat: |
With Frame_Ansprechpartner do
begin
If Active = false then
|
hier greifst du auf diese globale Variable zu.
da ich hier aber ein Frame_ansprechpartner:=TFrame_Ansprechpartner.create und zuweisung mit Parent zu einem Formular vermisse, muß es krachen. es existiert ja keine Instanz vom Frame.
Zitat: |
Habe das in einem anderen Formular auf ein Pannel gesetzt.. mehr nicht. Muss ich das noch extra erzeugen?
|
nein, aber du mußt dann auch auf diesen Frame zugreifen oder setzt du den iregndwo auf deine globale Variable?
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| implemention uses form2;
procedure LadeAnsprech(Kunde : Boolean; LNR : String); begin With [b]Form2[/b].Frame_Ansprechpartner do begin If Active = false then |
ich würd auch den aufbau des Frames ändern und deine Proc ladeansprech gleich mit aufnehmen(das ist ja grad das schöne an den Objekten), sonst verstreust du deine Methoden/Proceduren über deinen
ganzen Quelltext
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| unit Frame_unit type TFrame_Ansprechpartner = class(TFrame) Splitter2: TSplitter; .... public { Public-Deklarationen } procedure LadeAnsprech(Kunde : Boolean; LNR : String); ... end; ... procedure TFrame_Ansprechpartner.LadeAnsprech(Kunde : Boolean; LNR : String); begin If Active = false then begin rs := TResultSet.create(app); Active := true; end;
rs.Open('select Nummer, lnr, Anrede=(case geschlecht when ''W'' then ''Frau'' else ''Herr'' end),Nachname=name,'+ ' Vorname=vorname, Telefon=telefon,Telefax=telefax, Email=email, Handy=handy, bemerkung '+ 'from LAnsprec ' + 'where lnr='''+LNR+''' ORDER BY name, vorname',20); rs.MapToGrid(sg); FlatMemo2.Text := sg.Cells[9, sg.row] ; end; |
edit:
achso, nochwas
Zitat: |
rs := TResultSet.create(app);
|
keine ahnung was resultset ist, aber ich würde dieses gleich im Constructor vom Frame erzeugen und im Destructor freigeben, da verlierst du nicht den überblick.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mo 10.03.03 17:47
Vielen Dank, ich werde es gleich morgen probieren (habe schon feierabend  ).
TResultset ist eine eigene Klasse in dem Programm. Da werden Tabelleninhalte reingeladen und datenbankzugriffe zu vermeiden, wenn sie nicht seinmüssen  .
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Di 11.03.03 11:27
hallo Keldorn,
vielen Dank noch einmal für deine Hilfe und vor allem für die Zeit, die du dir genommen hast mir zu helfen!
Ich habe jetzt meinen Denkfehler gefunden  ...
Zitat: |
Zitat:
var Frame_Ansprechpartner : TFrame_Ansprechpartner;
hier ist Frame_ansprechpartner global angelegt. und ich gehe von dieser Deklaration davon aus, das du vorhast, den/die Frames erst zur Laufzeit zu erzeugen (kein Problem ,mach ich auch) |
Das war mein eigentlicher Fehler. Das Frame will ich eigentlich nicht zur Laufzeit erzeugen. Das ist dann wohl die macht der Gewohnheit.  .
Naja, wie dem auch sei.. es läuft jetzt. Dabei habe ich aber "natürlich" auch gleuch deine Vorschläge zu Herzen Genommen und den Aufbau des Frames anders gestalltet.
Vielen Dank auf jeden Fall. Es ist immer wieder schön hier!
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
|