![]() |
Pointer auf TComponent versagt
Hi,
ich merke im Moment wie selten ich mich in den letzten Wochen mit Delphi beschäftigt habe. :lol: Ich erhalte im Moment ständig eine Zugriffsverletzung und ich weiß nicht warum. :? Der Fehler versteckt sich in folgender Methode:
Delphi-Quellcode:
Entscheidende Rolle spielt dabei diese Methode, auf die zugegriffen wird:
function TIPlugin.Install(aApplication: IApplication): integer; stdcall;
var pComp: PComponent; cComp: TComponent; ehHandler: TEventHandler; begin Result := NERROR_SUCCESS; ehHandler := TEventHandler.Create; try cComp := TComponent(aApplication.GetComponent('btnExport')); if ((cComp <> nil) and (cComp is TButton)) then begin (cComp as TButton).OnClick := ehHandler.OnBtnClick; end; gaApplication := aApplication; except Result := ERROR_UNKNOWN_ERROR; end; end;
Delphi-Quellcode:
Und zu guter Letzt sieht der Eventhandler so aus:
function TIApplication.GetComponent(sComponentName: WideString): Pointer;
var pResult: PComponent; cComp: TComponent; begin { Komponente des Forms finden und zurück an das Plugin geben } cComp := frmMain.FindComponent(sComponentName); pResult := @cComp; Result := pResult; end;
Delphi-Quellcode:
So... dise Zugriffsverletzung, die ich beim Aufrufen von TIPlugin.Install erhalte, kann ich nirgendwo aufspüren. Habe ich irgendwas übersehen?
TEventHandler = class
public procedure OnBtnClick(Sender: TObject); end; procedure TEventHandler.OnBtnClick(Sender: TObject); var exExporter: TExportDataSet; begin exExporter := TExportDataSet.Create; try exExporter.FileName := 'C:\Export.csv'; exExporter.DataSet := TDataSet(gaApplication.GetDataSet); exExporter.Seperator := ';'; exExporter.FixedLength := false; exExporter.ExportData; finally exExporter.Free; end; end; Chris |
Re: Pointer auf TComponent versagt
Hi,
versuch es mal, in dem Du
Delphi-Quellcode:
schreibst.
function TIPlugin.Install(const aApplication: IApplication): integer; stdcall;
Bei Interfaces entweder const oder var/out verwenden :) mfG mirage228 |
Re: Pointer auf TComponent versagt
Hi,
hat leider nicht funktioniert. :? Chris |
Re: Pointer auf TComponent versagt
Hi,
wie sieht es mit den "üblichen Verdächtigen" aus? Also
mfG mirage228 |
Re: Pointer auf TComponent versagt
Hi David,
Zitat:
Zitat:
Zitat:
Zitat:
Ich habe jetzt folgende Fehlerabfangroutinen:
Delphi-Quellcode:
Und was bekomme ich? - Genau eine Zugriffsverletzung bei der Zeile
begin
Result := NERROR_SUCCESS; ehHandler := TEventHandler.Create; try try pComp := aApplication.GetComponent('btnExport'); except Result := ERROR_INVALID_EXP; Exit; end; if pComp = nil then begin Result := ERROR_INVALID_POINTER; Exit; end; try cComp := TComponent(pComp); except Result := ERROR_INVALID_EXP; Exit; end; if cComp = nil then begin Result := ERROR_INVALID_COMPONENT; Exit; end; if (cComp is TButton) then begin (cComp as TButton).OnClick := ehHandler.OnBtnClick; end else begin Result := ERROR_INVALID_TYPE; Exit; end; gaApplication := aApplication; except Result := ERROR_UNKNOWN_ERROR; Exit; end;
Delphi-Quellcode:
der Hauptanwendung. :wall:
case iPlg.Install(iApp) of
Chris |
Re: Pointer auf TComponent versagt
Du kannst doch in der Plugin DLL unter Start->Parameter die EXE angeben und dann auf Laden klicken. Breakpoints in der Plugin DLL (DPR) sollten dann angesprungen werden...
mfG mirage228 |
Re: Pointer auf TComponent versagt
Hi,
in der DLL an sich steht aber nichts. ;) Das ganze ist in einzelnen Units ausgelagert. :zwinker: Außerdem stürzt die Hostanwendung mit dem gleichen Fehler ab, weil bei dem jetzigen Source der Fehler ja schon beim Aufruf passiert. O.o Chris |
Re: Pointer auf TComponent versagt
Moin Chris,
wozu soll das
Delphi-Quellcode:
eigentlich gut sein? :gruebel:
pResult := @cComp;
Das Ergebnis Deiner Methode ist dadurch die Adresse des Pointers der Komponente, und nicht die Komponente selber. Also müsstest Du das Ergebnis von GetComponent dereferenzieren, damit es funktioniert: z.B. so:
Code:
oder so:
cComp := TComponent(aApplication.GetComponent('btnExport')[b][color=red]^[/color][/b]);
if ((cComp <> nil) and (cComp is TButton)) then begin (cComp as TButton).OnClick := ehHandler.OnBtnClick; end;
Code:
cComp := TComponent(aApplication.GetComponent('btnExport'));
if ((cComp[b][color=red]^[/color][/b] <> nil) and (cComp[b][color=red]^[/color][/b] is TButton)) then begin (cComp[b][color=red]^[/color][/b] as TButton).OnClick := ehHandler.OnBtnClick; end; |
Re: Pointer auf TComponent versagt
Hi Christian,
danke, das hat mir die Access-Violation vom Hals geschafft. :) Allerdings bekomme ich jetzt ERROR_INVALID_COMPONENT zurück. :arrow: cComp ist nil. :? Zu deiner Frage, wozu das gut sein soll: wenn ich TComponent zurückgebe bekomme ich doch Probleme mit der Unit ShareMem; sprich ich muss sie einbinden. Das will ich eigentlich vermeiden. ;) Chris |
Re: Pointer auf TComponent versagt
Hi,
habe jetzt ein wenig herumgesponnen und es geschafft ohne einen Pointer auf TComponent auszukommen. Das funktioniert jetzt mit einigen kleinen Änderung. :) Danke für eure Hilfe! Chris PS: Außerdem war der Name des Buttons falsch, aber das war noch ein anderes Problem. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 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