Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente (https://www.delphipraxis.net/178017-zugriffsverletzung-bei-event-bei-zur-laufzeit-erstellter-komponente.html)

machstuhl 11. Dez 2013 13:34

Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Die Komponente wird ohne Probleme erstellt; die Ereignisse onChange und onKeyPress werden fehlerfrei ausgeführt.
Sobald ich onKeyUp oder onKeyDown benutze erhalte ich eine Exception (Zugriffsverletzung): ...bei Adresse 0018FC8F. Schreiben von Adresse...
Warum?

Delphi-Quellcode:
unit prozeduren;

interface

uses
  Mapi, SysUtils, Classes, IniFiles, AdvCombo, Graphics, StdCtrls, Controls, Dialogs;

procedure combobox_erstellen(Top, Left : Integer; Besitzer : TComponent; Vater : TWinControl);
procedure combobox_change(Sender : TObject);
procedure combobox_KeyPress(Sender : TObject; var Key: Char);
procedure combobox_KeyUp(Sender : TObject; var Key: Word; Shift: TShiftState);

Var CB : TAdvComboBox;

implementation

uses fo_haupt;

procedure combobox_erstellen(Top, Left : Integer; Besitzer : TComponent; Vater : TWinControl);
Var MyButton : TButton;
begin
  CB := TAdvComboBox.Create(Besitzer);
  CB.Parent := Vater;
  CB.Top := Top;
  CB.Left := Left;

  CB.Text := 'Personen-Suche';
  CB.Font.Color := clGrayText;
  CB.AutoComplete := false;
  CB.Name := 'combo_Suche2';

  @CB.OnChange := @combobox_change;
  @CB.OnKeyPress := @combobox_KeyPress;
  @CB.OnKeyUp := @combobox_KeyUp;
//  @CB.OnKeyDown := @combobox_KeyUp;
end;

procedure combobox_change(Sender : TObject);
begin
  if CB.Font.Color <> clBlack
    then
      CB.Font.Color := clBlack;
end;

procedure combobox_KeyPress(Sender : TObject; var Key: Char);
begin
  fm_haupt.label1.caption := CB.Text;
end;

procedure combobox_KeyUp(Sender : TObject; var Key: Word; Shift: TShiftState);
begin
  fm_haupt.label2.caption := CB.Text;
end;

end.
so wirds aufgerufen
Delphi-Quellcode:
procedure Tfm_haupt.Button1Click(Sender: TObject);
begin
  combobox_erstellen(20, 20, fm_haupt, Panel1);
end;

CarlAshnikov 11. Dez 2013 13:53

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Ich denke die Zuweisung von Events solltest du so machen
Delphi-Quellcode:
 CB.OnChange := combobox_change;
Wozu die @s?

baumina 11. Dez 2013 13:57

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Also das was du da machst ist äußerst seltsam. Mein Vorschlag wäre, dass du die Prozeduren in dein Formular nimmst.

Delphi-Quellcode:
  Tfm_haupt = class(TForm)
    ...
  private
    procedure combobox_erstellen(Top, Left : Integer; Besitzer : TComponent);
    procedure combobox_change(Sender : TObject);
    procedure combobox_KeyPress(Sender : TObject; var Key: Char);
    procedure combobox_KeyUp(Sender : TObject; var Key: Word; Shift: TShiftState);
  end;

var
  fm_haupt : Tfmhaupt;

implementation

{$R *.DFM}

procedure Tfm_haupt.combobox_erstellen(Top, Left : Integer; Besitzer : TComponent);
Var CB : TAdvComboBox;
begin
   CB := TAdvComboBox.Create(Besitzer);
   CB.Parent := Besitzer;
   CB.Top := Top;
   CB.Left := Left;

   CB.Text := 'Personen-Suche';
   CB.Font.Color := clGrayText;
   CB.AutoComplete := false;
   CB.Name := 'combo_Suche2';

   CB.OnChange := combobox_change;
   CB.OnKeyPress := combobox_KeyPress;
   CB.OnKeyUp := combobox_KeyUp;
// CB.OnKeyDown := combobox_KeyUp;
end;

procedure Tfm_haupt.combobox_change(Sender : TObject);
begin
   if TAdvComboBox(Sender).Font.Color <> clBlack
     then
       TAdvComboBox(Sender).Font.Color := clBlack;
end;

procedure Tfm_haupt.combobox_KeyPress(Sender : TObject; var Key: Char);
begin
   label1.caption := TAdvComboBox(Sender).Text;
end;

procedure Tfm_haupt.combobox_KeyUp(Sender : TObject; var Key: Word; Shift: TShiftState);
begin
   label2.caption := TAdvComboBox(Sender).Text;
end;

procedure Tfm_haupt.Button1Click(Sender: TObject);
begin
   combobox_erstellen(20, 20, Panel1);
end;

ChrisE 11. Dez 2013 14:06

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Hallo,

die Methoden die du zuweißt
Delphi-Quellcode:
@<MethodenName>
können so nicht funktionieren, da hier keine Proceduren mit der Signatur
Delphi-Quellcode:
Sender: TObject
gefordert sind, sondern
Delphi-Quellcode:
procedure(Sender: TObject) of object
(Siehe Deklaration von TNotifyEvent).
Delphi-Quellcode:
of object
ist der Hinweiß, die Methoden müssen einem Objekt gehören - wie es baumina vorschlägt z.B. dem Formular zuordnen.
Die fix kodierte Namenzuweisung dürfte früher oder später auch für Proble sorgen. Ich würde davon auch abraten.

Gruß, Chris

Dalai 11. Dez 2013 14:07

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Darf ich fragen, warum die Prozeduren keine Methoden der Form-Klasse fm_haupt sind?

MfG Dalai

ChrisE 11. Dez 2013 14:10

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Hallo Dalai,

wem gilt die Frage?

Gruß, Chris

machstuhl 11. Dez 2013 14:13

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Danke für die fixen Antworten.

Zitat:

Zitat von Dalai (Beitrag 1239436)
Darf ich fragen, warum die Prozeduren keine Methoden der Form-Klasse fm_haupt sind?

MfG Dalai

ich möchte die Komponente gerne in mehreren verschiedenen Formularen zur Laufzeit erstellen lassen und dachte mir, das ich einfach alles auslager.

ChrisE 11. Dez 2013 14:16

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Du könntest ein Frame für sowas verwenden und dieses dann zur Laufzeit immer stellen. Auf das Frame packst du vorher die Combo und klickst dir deine Methoden zusammen. Am schluss, muss du nur noch ein Frame erzeugen, platzieren etc. wo du es brauchst. Entweder zur Laufzeit oder Vorher.

Gruß, Chris

machstuhl 11. Dez 2013 14:23

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Zitat:

Zitat von ChrisE (Beitrag 1239440)
Du könntest ein Frame für sowas verwenden und dieses dann zur Laufzeit immer stellen. Auf das Frame packst du vorher die Combo und klickst dir deine Methoden zusammen. Am schluss, muss du nur noch ein Frame erzeugen, platzieren etc. wo du es brauchst. Entweder zur Laufzeit oder Vorher.

Gruß, Chris

Gehts auch irgendwie so wie ich mir das vorgestellt habe? Habe noch nie mit Frames gearbeitet :oops:

ChrisE 11. Dez 2013 14:30

AW: Zugriffsverletzung bei Event bei zur Laufzeit erstellter Komponente
 
Hmm - klar.

So wie du es von baumina gezeigt bekommen hast. Aber schau dir das mit den Frames ruhig nochmal an, dass ist kein Fehler die zu kennen. Und es ist im Endeffekt nichts anders als mit Formularen zu arbeiten :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr.
Seite 1 von 2  1 2      

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