N'Abend Community,
vielleicht könnt Ihr mir weiterhelfen. Ich erarbeite mir einen Weg, ein größeres Delphi 6 Projekt häppchenweise
auf XE5 zu portieren und beschäftige mich dabei mit
ActiveX-dlls.
Häufig wiederkehrende Operationen habe ich im Alt-Code in speziellen Prozeduren gecodet, die dann per call-by-reference auf
den Objekten der Applikation werkeln (ComboBoxen, StringGrinds, etc). Diese Prozeduren möchte ich nun in
ActiveX-dlls, die
ich unter XE5 entwickeln werde, shiften.
Beispiel:
Delphi-Quellcode:
procedure sel_CB(SelText: string; var CBox: TComboBox);
var
NumIndex : integer;
boolGefunden : boolean;
begin
NumIndex:=0;
boolGefunden:=false;
while (not BoolGefunden) and (NumIndex <CBox.Items.Count) do begin
if SelText = CBox.Items[NumIndex] then begin
boolGefunden:=true;
CBox.ItemIndex:=NumIndex
end else Inc(NumIndex);
end;
if not boolGefunden then CBox.ItemIndex:=0;
end;
Im ersten Step habe ich versucht, einen WideString per reference von einer
ActiveX-
dll bearbeiten zu lassen.
Alles kompiliert (
dll und Test-Client), aber beim Aufruf schlägt es fehl. Woran kann das liegen? Kann man überhaupt
(mit vertretbarem Aufwand)
VCL-
GUI-Objekte auf diese Weise von dlls bearbeiten lassen?
Test-
dll mit WideString-Manipulation:
Delphi-Quellcode:
unit uC1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows,
ActiveX, Classes, ComObj, Beispiel3_TLB, StdVcl,
Dialogs;
type
TC1 =
class(TTypedComObject, IC1)
protected
function showString(
const s1: WideString): WideString;
stdcall;
function alterString(
var s1: WideString): HResult;
stdcall;
end;
implementation
uses ComServ;
function TC1.showString(
const s1: WideString): WideString;
begin
showmessage(s1);
end;
function TC1.alterString(
var s1: WideString): HResult;
begin
s1 := s1 + '
DRANGEHÄNGT';
end;
initialization
TTypedComObjectFactory.Create(ComServer, TC1, Class_C1,
ciMultiInstance, tmApartment);
end.
Test-Client:
Delphi-Quellcode:
unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Beispiel3_TLB,
Vcl.StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
mC1 : C1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var s1: WideString;
begin
s1 := '
Vorgabe';
mC1.showString('
Würze');
mC1.alterString(s1);
showmessage(s1);
end;
Initialization
mC1 := CoC1.Create;
end.
Danke
Tilo