AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language TPopUpMenu-Shortcuts in Frame - Access violation
Thema durchsuchen
Ansicht
Themen-Optionen

TPopUpMenu-Shortcuts in Frame - Access violation

Ein Thema von Perlsau · begonnen am 6. Mai 2015 · letzter Beitrag vom 6. Mai 2015
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

TPopUpMenu-Shortcuts in Frame - Access violation

  Alt 6. Mai 2015, 05:55
Delphi-Version: XE7
Und weil's grad so schön war, hab ich gleich noch ein Problem. Vielleicht leg ich mich ja gleich nach dem Posten wieder schlafen und träume von der Lösung. Doch Spaß beiseite:

Auf einem Frame, der in einem TPanel der Mainform erscheint, habe ich zwei TjvDbRichEdit-Komponenten (JediDbRich), die von einer Firebird-Datenbank versorgt werden. Da gibt es zum einen das Feld PERS_BIO und zum anderen das Feld PERS_ADRES in derselben Tabelle. Beide JediDbRich sind standardmäßig auf ReadOnly gesetzt, damit der Anwender nicht aus Versehen darin rumkritzelt oder unabsichtlich was löscht. Die beiden JediDbRich teilen sich ein TPopUpMenu, das Einträge zur Textgestaltung beinhaltet wie Schriftdialog, Fett, Normal usw. Die Einträge verfügen über Shortcuts, z.B. Strg-F für Fett. Wenn ich nun in den Edit-Modus wechsle, damit ich die Einträge bearbeiten kann – dabei werden die Edit-Felder alle auf ReadOnly := False gesetzt und die Einträge im PopUpMenu Enabled –, danach einen Text im RichEdit markiere und z.B. Strg-K drücke, erhalte ich eine Zugriffsverletzung:

Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x0080e554: read of address 0x00000000'

Wenn ich denselben Menüpunkt mit der Maus auswähle, wird der markierte Text anstandslos kursiv gesetzt. Danach kann ich auch wieder die Shortcuts verwenden, die funktionieren dann – bis zum nächsten Erzeugen des Frames (Frames werden in diesem Programm bei Bedarf immer neu erzeugt und danach wieder freigegeben). Da ich diese Proceduren auch in anderen Frames verwenden möchte, habe ich die eigentliche Funktionalität in die Unit GLD (steht für GlobalData) ausgelagert, z.B.:
Delphi-Quellcode:
// ----- Schriftart im übergebenen TjvDbRichEdit auf fett einstellen -----
Procedure Schrift_Fett(TED : TjvDBRichEdit);
Begin
  If TED.SelLength = 0 THEN Exit;
  TED.SelAttributes.Style := [fsBold];
End;
Aufgerufen wird das dann vom Frame aus so (weil ich ja zwei TvjDbRichEdit im Frame habe):
Delphi-Quellcode:
// ---------- Schrift fett ---------- Ereignisse
Procedure TFrame_Personen.PuM_FettClick(Sender: TObject);
begin
  GLD.Schrift_Fett(PuM_Personen.PopupComponent as TJvDBRichEdit);
end;
Irgendwas ist da noch nicht initialisiert, aber ich hab im Moment absolut keinen Plan, wo ich suchen könnte
Miniaturansicht angehängter Grafiken
dbrich_browse.jpg   dbrich_edit.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: TPopUpMenu-Shortcuts in Frame - Access violation

  Alt 6. Mai 2015, 06:12
Delphi-Quellcode:
Procedure TFrame_Personen.PuM_FettClick(Sender: TObject);
begin
  Assert(Assigned(PuM_Personen), 'foo');
  Assert(Assigned(PuM_Personen.PopupComponent), 'bar');
  GLD.Schrift_Fett(PuM_Personen.PopupComponent as TJvDBRichEdit);
end;
ändert nichts? (am Besten nicht als Release kompiliert)
$2B or not $2B
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: TPopUpMenu-Shortcuts in Frame - Access violation

  Alt 6. Mai 2015, 06:40
Verstehe ich nicht: was soll das foo und das bar? Ich versteh ja nicht einmal, wieso die Zugriffsverletzung überhaupt ausgelöst wird. Mit deinem Vorschlag erhalte ich jetzt:

Exception der Klasse EAssertionFailed mit der Meldung 'bar Fram_Personen.pas, Zeile 349)'

Achso, jetzt fällt der Groschen (ich glaub, ich muß mich bald nochmal hinlegen): foo und bar dienen lediglich der Kennzeichnung, um an der Fehlermeldung erkennen zu können, ob entweder das PopUpMenu oder die Komponente, von der aus es aufgerufen wird, noch nicht verfügbar ist (oder so ähnlich ...). Das bedeutet, die Eigenschaft PopUpComponent ist Nil, wenn ich das PopUpMenu (PuM) beim ersten Mal via Shortcut aufrufe. Tja, wie macht man das dann? Auf Shortcuts verzichten? Und wieso geht's dann, nachdem ich einmal mit der Maus aufgerufen habe?

Ahh ... jetzt hab ich was rausgefunden: Wenn ich beim ersten Mal in der ersten Komponente einen Text markiere und dann das PuM mit der Maus aufrufe, wird korrekterweise der markierte Text verändert. Danach demarkiere ich den veränderten Text im ersten RichEdit wieder und markiere einen Text im zweiten RichEdit. Rufe ich dann z.B. Fett via Shortcut auf, wird der Text im ersten RichEdit fett gesetzt, obwohl der ja gar nicht markiert ist. Ich muß also beim Enter in ein RichEdit die Eigenschaft PuM_Personen.PopupComponent selber setzen. Das probier ich jetzt gleich mal aus.

Das war's!!!
Delphi-Quellcode:
procedure TFrame_Personen.DbRich_Pers_BioEnter(Sender: TObject);
begin
  PuM_Personen.PopupComponent := DbRich_Pers_Bio;
end;

procedure TFrame_Personen.DbRich_Pers_AdresEnter(Sender: TObject);
begin
  PuM_Personen.PopupComponent := DbRich_Pers_Adres;
end;
Danke, Himitsu, du bist unersetzlich

Geändert von Perlsau ( 6. Mai 2015 um 06:56 Uhr) Grund: Lösung gefunden
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 08:59 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