![]() |
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:
Ergebnis: ein Zugriffsfehler.
NeuerButton.Enabled := <Boolscher Ausdruck>
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? |
Re: Zugriffsverletzung durch neues Formular-Objekt
Wie, neue Schaltfläche auf Toolbar gezogen? Das macht man doch mit rechter Maustaste, oder?
|
Re: Zugriffsverletzung durch neues Formular-Objekt
freilich: Rechtsklick -> Neuer Schalter
Hat jemand eine Idee? |
Re: Zugriffsverletzung durch neues Formular-Objekt
Was ab und zu hilft: Projekt nicht nur kompilieren, sondern erzeugen.
|
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)
|
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 |
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.
|
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. |
Re: Zugriffsverletzung durch neues Formular-Objekt
Kennt niemand diese Nachricht: "Ungültiger Ausdruck im Evaluator"?
|
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 |
Re: Zugriffsverletzung durch neues Formular-Objekt
Hallo SebE,
[quote="SebE"]
Delphi-Quellcode:
[quote]
NeuerButton.Enabled := <Boolscher Ausdruck>
Zitat:
Hast DU den mal durch ein True oder False ersetzt und dann mal getestet? Gruß TBx |
Re: Zugriffsverletzung durch neues Formular-Objekt
Hallo,
0. mehr Quellcode 1. Hast du vielleicht in der Routine sowas stehen ?
Delphi-Quellcode:
2.
procedure TFirm1.Bla;
var ToolButton1: TToolButton; begin ToolButton1.Enabled:= False; end; 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 |
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. |
Re: Zugriffsverletzung durch neues Formular-Objekt
Vergessen zu erwähnen: Ich kann auch nicht lesend darauf zugreifen.
Delphi-Quellcode:
myBool := ToolButton1.Enabled
|
Re: Zugriffsverletzung durch neues Formular-Objekt
Hab das Problem nochmal einkreisen können:
So kracht's:
Delphi-Quellcode:
Und so läuft's:
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin ToolButton1.Enabled := true end;
Delphi-Quellcode:
Kann es sein, dass der Name "Toolbutton1" falsch zugewiesen wird?
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin ttoolbutton(sender).Enabled := true end; |
Re: Zugriffsverletzung durch neues Formular-Objekt
Zitat:
([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. |
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.
|
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:
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.
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin showmessage (TToolButton(sender).name); end; Ansonsten gib uns einfach mal ein bisserl mehr Code, ich hab bei den Klaskugelwerken gerade kein Guthaben mehr ;-) Gruß Thomas |
Re: Zugriffsverletzung durch neues Formular-Objekt
[OT] Thomas, nanu? Namen ändern lassen oder Zweitaccount? ;) [/OT]
|
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:
ist der Button NACH dem klicken nicht mehr "klickbar"...also es funktioniert
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin ttoolbutton(sender).Enabled := true end; EDIT: Es funktioniert auch bei anderen NEUEN Objekten nicht...egal was ich hinzufüge. (Aber NUR im Hauptformular) |
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:
beim Klick auf den Button anzeigen, eventuell kommst Du so ja dahinter, was da für ein Objekt im Sender steht.
ShowMessage(Sender.ClassName);
|
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. |
Re: Zugriffsverletzung durch neues Formular-Objekt
Hallo,
Zitat:
Delphi-Quellcode:
funktioniert ohne Exception. Beide haben eine Eigenschaft Enabled und daher funktioniert das.
procedure TForm1.ToolButton1Click(Sender: TObject);
begin TLabel(Sender).Enabled := False; ShowMessage(Sender.ClassName); end; |
Re: Zugriffsverletzung durch neues Formular-Objekt
Hallo,
Delphi-Quellcode:
Wie kannst du auf ToolButton1 klicken,
procedure TfmMain.ToolButton1Click(Sender: TObject);
begin ToolButton1.Enabled := true end; 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 |
Re: Zugriffsverletzung durch neues Formular-Objekt
Zitat:
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:
|
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 |
Re: Zugriffsverletzung durch neues Formular-Objekt
Das Ergebnis von ...
Delphi-Quellcode:
... wäre ja sicher mal ganz interessant. ;)
procedure TForm1.ToolButton1Click(Sender: TObject);
begin ShowMessage(Sender.ClassName); end; |
Re: Zugriffsverletzung durch neues Formular-Objekt
Hallo,
Zitat:
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. |
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:
ergibt "TToolBar"
ShowMessage(Sender.ClassName);
Edit: ergibt "TToolButton"
Delphi-Quellcode:
funktioniert ja nicht
showmessage(toolbutton1.ClassName)
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: ) |
Re: Zugriffsverletzung durch neues Formular-Objekt
Hat das mit den Umlauten Delphi gemacht? Oder warst du das?
Delphi-Quellcode:
Edit: Mein D7 macht sowas nicht.
object btOeffnen: TToolButton
Left = 23 Top = 0 Hint = 'Datei '#246'ffnen...' Caption = #214'&ffnen' ImageIndex = 1 OnClick = miOeffnenClick end Sherlock |
Re: Zugriffsverletzung durch neues Formular-Objekt
Über den OI funktioniert das "Datei öffnen" (ohne Tricks)
Edit:
Delphi-Quellcode:
ist:
object btOeffnen: TToolButton
Left = 23 Top = 0 Hint = 'Datei öffnen...' Caption = 'Ö&ffnen' ImageIndex = 1 OnClick = miOeffnenClick end Zitat:
|
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:
Das könnten Kandidaten dazu sein, geht da eventuell irgendwas schief?
procedure SetButtons(const SynEdit: TSynEdit; const SelectedText: BOOL;
const TabsExist, MoreThanOneTabExist: BOOL); procedure SetTextStatusButtons(const SynEdit: TSynEdit; const TabsExist, SelectedText: BOOL); 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] |
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) |
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:
aber nicht im OI.
Hint = 'Datei '#246'ffnen...'
Caption = #214'&ffnen' |
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