Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Zugriffsverletzung durch neues Formular-Objekt (https://www.delphipraxis.net/127303-zugriffsverletzung-durch-neues-formular-objekt.html)

SebE 10. Jan 2009 20:24


Zugriffsverletzung durch neues Formular-Objekt
 
Hi Leute,
hab heute ein echt merkwürdiges Problem:

Ich habe ein Projekt (wird immer mal erweitert).
Hatte ich eine neue Idee - wollte sie natürlich auch gleich umsetzten....also:
Neue Schaltfläche (TToolButton) auf ToolBar gezogen.

Die Schaltfläche soll nicht immer "enable" sein, deshalb in (irgendeiner) Routine
Delphi-Quellcode:
NeuerButton.Enabled := <Boolscher Ausdruck>
Ergebnis: ein Zugriffsfehler.

Es ist egal, wo und wann ich das mache...immer das gleiche...aber die anderen ToolButtons gehen doch auch!?

Hab ich eine (magische) Grenze überschritten (so groß is das Projekt nicht)?

Erzeugt ist das Objekt auch (ich seh's ja auf dem Formular).

Ich weiß echt nicht weiter?

Handelt es sich dabei um einen Bug in der IDE?

sirius 10. Jan 2009 22:40

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Wie, neue Schaltfläche auf Toolbar gezogen? Das macht man doch mit rechter Maustaste, oder?

SebE 11. Jan 2009 17:12

Re: Zugriffsverletzung durch neues Formular-Objekt
 
freilich: Rechtsklick -> Neuer Schalter

Hat jemand eine Idee?

DeddyH 11. Jan 2009 17:58

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Was ab und zu hilft: Projekt nicht nur kompilieren, sondern erzeugen.

SirThornberry 11. Jan 2009 18:02

Re: Zugriffsverletzung durch neues Formular-Objekt
 
wenn es immer durch diesen Aufruf ist, einfach mal einen Haltepunkt setzen und Schritt für Schritt durchgehen (mit Debug-DCUs debuggen)

SebE 11. Jan 2009 18:56

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Also (nur) Erzeugen funktioniert leider nicht.

Im Debugger bekomm ich folgende Informationen:

Überwachte Ausdrücke:
"ToolButton1" ergibt "([], $6A00A345)"
"ToolButton1.Enabled" ergibt "Ungültiger Ausdruck im Evaluator" <---- ???

danach rummst es im RAM.

Was könnte es sein? Ich tendiere immer noch auf IDE-Fehler

DeddyH 11. Jan 2009 19:10

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Nimm den Toolbutton doch nochmal raus, kommentiere die entsprechenden Zeilen aus, erzeuge das Projekt neu und dann nimm ihn wieder rein.

SebE 11. Jan 2009 19:42

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hab ich schon probiert.
Hab alle ObjectDateien (dcu, res, exe) entfernt...

Neustart wurde durchgeführt...wer weiß, hätte ja etwas bringen können, falls der Fehler beim OS gelegen hätte.

SebE 12. Jan 2009 12:26

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Kennt niemand diese Nachricht: "Ungültiger Ausdruck im Evaluator"?

angos 12. Jan 2009 13:17

Re: Zugriffsverletzung durch neues Formular-Objekt
 
hmm,

vielleicht hilft dir folgender Tipp: Lösche mal alle Zusatzdaten zur Projektdatei, also Projektdatei.res unds so weiter.

Danach Projekt neu Starten (die .res wird in diesem Fall neu erzeugt) und schauen, ob du das dann erzeugen kannst.
Hat mir schon häufig bei Fehlermeldungen geholfen, welche an sich keine waren...

Einziges Problem: Die Projekteinstellungen sind danach flöten. Die musst du also vorm neu-erzeugen nachtragen.


Gruß
Ansgar

TBx 12. Jan 2009 13:33

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo SebE,

[quote="SebE"]
Delphi-Quellcode:
NeuerButton.Enabled := <Boolscher Ausdruck>
[quote]
Zitat:

Zitat von SebE
"Ungültiger Ausdruck im Evaluator"?

ich würd mal darauf tippen, dass Dein <Boolscher Ausdruck> fehlerhaft ist.
Hast DU den mal durch ein True oder False ersetzt und dann mal getestet?

Gruß

TBx

hoika 12. Jan 2009 14:17

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,

0. mehr Quellcode

1.
Hast du vielleicht in der Routine sowas stehen ?

Delphi-Quellcode:
procedure TFirm1.Bla;
var
  ToolButton1: TToolButton;
begin
  ToolButton1.Enabled:= False;
end;
2.
Klingt schon merkwürdig, das ein neuer ToolButton von der IDE ToolButton1 heisst,
und nicht ToolButton2 oder so.

3. weise deinen Bool-Code mal einer lokalen Variablen zu,
und schau dir an, ob es dort schon kracht.

Delphi-Quellcode:
var
  bBool: Boolean;
begin
  bBool:= bla; <- Breakpoint und watchpoint auf ToolButton1.Name
  ToolButton1.bEnabled:= bBool;

Heiko

SebE 12. Jan 2009 14:52

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Danke für eure Antworten.

Wie ich schon geschrieben habe: Ich habe alles gelöscht.
Ich habe die Anweisung in einer Routine (testweise), in der nichts anderes steht
Und mein Boolscher Ausdruck ist (wieder testweise) TRUE oder FALSE.

Es wird vorher nichts anderes Aufgerufen...Es verhält sich so, als ob das Object nur teilweise erstellt wird.

Das Objekt heißt Toolbutton1, weil ich den anderen schon (vor längerem) sinnvolle Namen gegeben habe.

Bin echt am verzweifeln...will aber nicht die gesamte Oberfläche neu erstellen.
Es muss doch eine Ursache geben.

SebE 12. Jan 2009 14:56

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Vergessen zu erwähnen: Ich kann auch nicht lesend darauf zugreifen.

Delphi-Quellcode:
myBool := ToolButton1.Enabled

SebE 12. Jan 2009 15:04

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hab das Problem nochmal einkreisen können:

So kracht's:
Delphi-Quellcode:
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin
ToolButton1.Enabled := true
end;
Und so läuft's:
Delphi-Quellcode:
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin
ttoolbutton(sender).Enabled := true
end;
Kann es sein, dass der Name "Toolbutton1" falsch zugewiesen wird?

Uwe Raabe 12. Jan 2009 15:07

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Zitat:

Zitat von SebE
Überwachte Ausdrücke:
"ToolButton1" ergibt "([], $6A00A345)"

Also bei mir steht da schon wesentlich mehr:

([csInheritable], False, (0, 0), (11, 11), (0, 0), 0, 0, 23, 22, $A383E0)

Aber ohne etwas mehr von deinem Code kann man da gar nichts sagen.

DeddyH 12. Jan 2009 15:07

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Wirf doch mal einen Blick in die Klassendefinition Deines Formulars sowie dessen *.dfm. Irgendetwas muss da ja komisch sein.

TBx 12. Jan 2009 15:12

Re: Zugriffsverletzung durch neues Formular-Objekt
 
mal davon abgesehen, dass der Code niemals ausgeführt wird (einen disabled Button kann man nicht klicken) sieht mir das ganz so aus, als hieße die Komponente eben nicht Toolbutton1.
Laß Dir doch mal den Namen ausgeben:

Delphi-Quellcode:
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin
  showmessage (TToolButton(sender).name);
end;
Bei der Gelegenheit siehst Du dann auch mal, wie oft die procedure aufgerufen wird und von wem. Es muß ja nicht unbedingt an dem Toolbutton liegen.

Ansonsten gib uns einfach mal ein bisserl mehr Code, ich hab bei den Klaskugelwerken gerade kein Guthaben mehr ;-)

Gruß

Thomas

DeddyH 12. Jan 2009 15:14

Re: Zugriffsverletzung durch neues Formular-Objekt
 
[OT] Thomas, nanu? Namen ändern lassen oder Zweitaccount? ;) [/OT]

SebE 12. Jan 2009 15:16

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Also Klassendefinition meiner TForm ist korrent...alles vorhanden.
In der *.dfm ist auch alles drin.

@TBx:

bei

Delphi-Quellcode:
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin
ttoolbutton(sender).Enabled := true
end;
ist der Button NACH dem klicken nicht mehr "klickbar"...also es funktioniert

EDIT: Es funktioniert auch bei anderen NEUEN Objekten nicht...egal was ich hinzufüge.
(Aber NUR im Hauptformular)

nahpets 12. Jan 2009 15:31

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,

@SebE

bei meinem Delphi 7 funktioniert das Toolbutton1.Enabled := True ohne Probleme.
Du schreibst, Du hättest den Toolbutton auf die Toolbar gezogen, wie geht das? Habe meine Toolbuttons per Rechtsklick und Menüeintrag erstellt. Gibt es da eventuell einen Unterschied zwischen TToolbutton?
Kann mich schwach erinnern, so ein Problem vor längerer Zeit auch mal gehabt zu haben und das die Toolbuttons nur dann funktionierten, wenn ich sie über Rechtsklick auf die Toolbar und Neuer Schalter hinzugefügt hatte.

Lass Dir doch mal
Delphi-Quellcode:
ShowMessage(Sender.ClassName);
beim Klick auf den Button anzeigen, eventuell kommst Du so ja dahinter, was da für ein Objekt im Sender steht.

SebE 12. Jan 2009 15:38

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Ich hab herausgefunden, dass es nicht nur bei ToolButtons passiert, sondern bei allen neuen Objekte, die nicht schon vorhanden sind.

"Draufgezogen" heißt natürlich Rechtsklick -> "Neuer Schalter".

Ich weiß, dass es das richtige Objekt ist, da "TToolButton(Sender).Enabled := false" funktioniert.

nahpets 12. Jan 2009 16:01

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,
Zitat:

Zitat von SebE
Ich hab herausgefunden, dass es nicht nur bei ToolButtons passiert, sondern bei allen neuen Objekte, die nicht schon vorhanden sind.

"Draufgezogen" heißt natürlich Rechtsklick -> "Neuer Schalter".

Ich weiß, dass es das richtige Objekt ist, da "TToolButton(Sender).Enabled := false" funktioniert.

so sicher ist das Wissen nicht, auch das (man mag es nicht glauben)
Delphi-Quellcode:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  TLabel(Sender).Enabled := False;
  ShowMessage(Sender.ClassName);
end;
funktioniert ohne Exception. Beide haben eine Eigenschaft Enabled und daher funktioniert das.

hoika 12. Jan 2009 17:50

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,

Delphi-Quellcode:
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin
  ToolButton1.Enabled := true
end;
Wie kannst du auf ToolButton1 klicken,
und dann den gleichen Toolbutton enablen.
Dann muss er ja vorher disabled gewesen sein.

Lösch mal im Object-Inspector das OnClick-Ereignis die Zeile raus.

Vielleicht hast du ja ToolButton1 kopiert incl. dem OnClick Event.
Durch Löschen und erneutem Doppelklick wird ein neues OnClick erzeugt (ToolButton2OnClick z.B.)


Heiko

SebE 12. Jan 2009 18:26

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Zitat:

so sicher ist das Wissen nicht, auch das (man mag es nicht glauben)
Ich werd ja wohl noch erkennen, dass sich die Eigenschaft Enabled des besagten Buttons ändert!

Mein Problem:
Ich kann in meinem bestehenden Projekt keine NEUEN Objekte hinzufügen (egal ob TButton, TToolButton, oder ein Eintrag ins MainMenu).

Ich suche jemanden, der diesen Fehler schon kennt und wie man das Problem lösen kann.

Antworten wie:
Zitat:

Wie kannst du auf ToolButton1 klicken,
und dann den gleichen Toolbutton enablen.
, die mir meine Programmierkenntnisse in Frage stellen, helfen mir überhaupt nicht.

hoika 13. Jan 2009 04:55

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,

> Wie kannst du auf ToolButton1 klicken, <
> und dann den gleichen Toolbutton enablen. <

Das sollte kein Angriff auf deine Progtrammierkenntnsse sein.
Dieser Code kommt meistens vom Kopieren einer Komponente,
wobei das OnClick-Event natürlich mit kopiert wird.

Was mich nur gewundert hat, war, dass OnToolBar1Click aufgerufen wird,
und der gerade angeklickte Button aktiviert wird,
d.h. vorher war er deaktiviert, konnte aber trotzdem angeklickt werden.


So ...
Nun zum Problem ... ;)

Schau dir mal deine DFM-Datei an,
vergleiche Sie mit einem anderen Formular
und suche nach Auffälligkeiten.

Vielleicht ist dort ja was schiefgegangen.

Ansonsten solltest du mal sämtlichen Code auskommentieen,
vielleicht machst du ja irgendwas im Speicher der VCL kaputt -> FastMM4


Heiko

nuclearping 13. Jan 2009 05:01

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Das Ergebnis von ...

Delphi-Quellcode:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  ShowMessage(Sender.ClassName);
end;
... wäre ja sicher mal ganz interessant. ;)

nahpets 13. Jan 2009 08:09

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,
Zitat:

Zitat von nuclearping
Das Ergebnis von ...

Delphi-Quellcode:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  ShowMessage(Sender.ClassName);
end;
... wäre ja sicher mal ganz interessant. ;)

bitte Teile uns mal dieses Ergebnis mit, ich weiß aus Erfahrung, dass da schonmal was schief geht, mein entsprechender Vorschlag kam nicht, weil ich an Deinen Fähigkeiten zweifle, sondern weil ich mir an ähnlichen Problemen schon 'nen Wolf gesucht habe.

Was eventuell helfen könnte:

Wenn die DFM als Text gespeichert ist:

In Delphi alle Projekte/Dateien schließen, so dass nur noch das reine Delphi geöffnet ist,
Delphi schließen,
Eine Sicherungskopie der DFM machen,
DFM-Datei in Notepad oder ähnlichem öffnen,
alles markieren und in die Zwischenablage kopieren,
neue Textdatei erstellen,
Zwischenablage dort hineinkopieren,
Speichern unter dem Namen der DFM,
Delphi öffnen,
Projekt öffnen,
prüfen, ob das Problem nun behoben ist.

Es kann schonmal passieren, dass in 'ner DFM irgendwelche Steuerzeichen sind, die man im Editor nicht sieht, die aber beim Kopieren über die Zwischenablage "verschwinden". Habe zugegebenermaßen keine Ahnung, was da dann wirklich passiert.

SebE 13. Jan 2009 11:11

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Danke für eure Vorschläge...das Mit dem Editor klingt einleuchtend (leider hat's nicht geholfen).
Achso:
Delphi-Quellcode:
ShowMessage(Sender.ClassName);
ergibt "TToolBar"
Edit: ergibt "TToolButton"

Delphi-Quellcode:
showmessage(toolbutton1.ClassName)
funktioniert ja nicht

EDIT: ES FUNKTIONIERT!!!

Da der Button das letzte Objekt ist, was hinzugefügt wurde, kommt er natürlich ans Ende der Deklarationen...aus Spaß zum Vorletzten Objekt gemacht (um eine Zeile nach oben kopiert) ==> Es läuft.

Aber warum das???
(ihr könnt jetzt an meinen Programmier-Kenntnissen zweifeln :wink: )

Sherlock 13. Jan 2009 11:22

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hat das mit den Umlauten Delphi gemacht? Oder warst du das?
Delphi-Quellcode:
    object btOeffnen: TToolButton
      Left = 23
      Top = 0
      Hint = 'Datei '#246'ffnen...'
      Caption = #214'&ffnen'
      ImageIndex = 1
      OnClick = miOeffnenClick
    end
Edit: Mein D7 macht sowas nicht.

Sherlock

SebE 13. Jan 2009 11:34

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Über den OI funktioniert das "Datei öffnen" (ohne Tricks)


Edit:

Delphi-Quellcode:
object btOeffnen: TToolButton
      Left = 23
      Top = 0
      Hint = 'Datei öffnen...'
      Caption = 'Ö&ffnen'
      ImageIndex = 1
      OnClick = miOeffnenClick
    end
ist:

Zitat:

object btOeffnen: TToolButton
Left = 23
Top = 0
Hint = 'Datei öffnen...'
Caption = 'Ö&ffnen'
ImageIndex = 1
OnClick = miOeffnenClick
end
Was??? ich dachte gerade das liegt am Forum...also mein Original-Quellcode sieht nicht so aus, wie "deiner"

nahpets 13. Jan 2009 11:47

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,

@Sherlock: Das mit den Umlauten macht Delphi (mein D7 tut das jedenfalls).

@SebE
habe mir gerade Deine Quelltext gekrallt und mal mein Delphi 7 versorgt.
Da Du von der Unit nur den Interfaceteil hier eingestellt hast, musste ich alle Ereignisroutinen auskommentieren, um Delphi zum Kompilieren zu überreden. Dadurch wurden dann auch alle Verweise auf Ereignisroutinen entfernt.

Dann habe ich kompiliert, anschließen einem ToolButton eine neue Ereignisroutine zugewiesen und dann mal mit ShowMessage(Sender.Classname) geschaut, was das ist. Bei mir kommt da TToolButton heraus, was wir ja eigentlich auch alle erwarten.

Wenn bei Dir dort aber TToolBar erscheint, scheint irgendwo eine Ereigniszuordnung schiefgelaufen zu sein. In der DFM kann ich aber nichts finden, was auf einen Fehler hinweist.
Hast Du eventuell irgend eine Routine (die situationsabhängig) den Menüs und Buttons andere Ereignisse zuweist?
Delphi-Quellcode:
procedure SetButtons(const SynEdit: TSynEdit; const SelectedText: BOOL;
  const TabsExist, MoreThanOneTabExist: BOOL);
procedure SetTextStatusButtons(const SynEdit: TSynEdit;
  const TabsExist, SelectedText: BOOL);
Das könnten Kandidaten dazu sein, geht da eventuell irgendwas schief?

Daher Vorschlag (befürchte mit viel Arbeit verbunden):
DFM als Text anzeigen.
In die Unit wechseln.
In der Unit alle Ereignisroutinen vollständig auskommentieren.
In die DFM wechseln und diese wieder in der Formularansicht anzeigen lassen.
Von Delphi nun alle Ereignisroutinen aus der DFM entfernen lassen (Delphi sollte hier nachfragen).
Kompilieren.
Auskommentierung der Ereignisroutinen rückgängig machen und dann die Ereignisse neu zuweisen.

[OT]Du benutzt die gleichen Namenskonventionen, wie ich es mache, konnt mich in Deinem Quelltext daher direkt "zu Hause" fühlen. Macht das Ganze doch deutlich einfacher :wink: )[/OT]

SebE 13. Jan 2009 12:00

Re: Zugriffsverletzung durch neues Formular-Objekt
 
:oops: "TToolBar" stand da nicht.... tut mir leid....hab ich aus Zeitnot verschrieben...es kam das raus, was rauskommen soll "TToolButton"....*mist*

Danke, dass du dir so viel Arbeit machst um mir zu helfen...ist echt derbe - danke.

Es funktioniert ja derzeit wieder - ich weiß nur nicht warum Delphi den letzten Eintrag im Deklarationsteil gesondert behandelt(?)

Stehen in dem Code, den ich gesendet habe, wirklich die Umlaute "verschlüsselt"...in meinem, den ich aufn Rechner habe ist das nicht so(?)...aber den hab ich ja geschickt(echt komisch)

nahpets 13. Jan 2009 12:24

Re: Zugriffsverletzung durch neues Formular-Objekt
 
Hallo,

also das mit den Umlauten in der DFM kenne ich eigentlich nur so, wie ich es hier aus dem Forum kopiert habe, von daher verwundert es mich nicht. Eventuell liegt es ja an irgendeiner Einstellung von Delphi oder am Zeichensatz des System oder oder oder. Das sollte aber eigentlich kein Problem sein. Achso, diese Versionen siehst Du nur in der Textansicht des Formulars
Delphi-Quellcode:
Hint = 'Datei '#246'ffnen...'
Caption = #214'&ffnen'
aber nicht im OI.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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