Arsip: Set value di dll

 
user image
more 12 years ago

EkoIndri

Kebetulan saya dah buat file dll. Didalam file dll itu saya berikan fungsi dengan output form. Catatan: Didalam form saya tambahkan object memo dengan isi beberapa kalimat. Nah waktu file dll itu saya akses dari aplikasi lain, fungsi tersebut saya pastikan utk dihitung jumlah object yang ada didalam form itu. Ternyata jumlah sesuai. Kemudian saya lanjutkan dengan mengecek dengan menggunakan showmessage untuk menampilkan informasi text yang ada di object memo, ternyata datanya benar. karena saya bisa akses tuh object memo, terus saya lanjutkan dengan mengubah isi text dari object memo. Ternyata usaha yang saya lakukan adalah sia-sia... bagi temen2 yang tahu solusi untuk mengubah data text dalam memo itu mohon dishare donk ilmunya... thanxs sebelumnya...
user image
more 12 years ago

DelphiExpert

bagaimana cara anda "membaca" text dalam memo? <getter> ; seperti itulah harusnya anda bisa lakukan set isi memo <setter>. well... akan lebih menjelaskan apabila code yg dibuat anda post juga...
user image
more 12 years ago

EkoIndri

intinya kan showmessage(memo1.text); itu kan bisa dilakukan di form biasa tapi kenapa itu tidak bisa saya lakukan terhadap memo yang ada didalam dll
user image
more 12 years ago

ImanD

@EkoIndri Bener sekali yg di bilang @DE, klo bisa getter kenapa setter ga bisa? mungkin parameternya yg di tangkap dll blom di setter ke dalam object memo tersebut.
user image
more 12 years ago

mat_koder

cobain nge-editnya pake Memo.Lines.Add('..................'); atau kalo ngga bisa juga cara, silakan cobain dibawah ini - pasti bisa ( sdh di coba dgn D7 di PC saya ) Yg di-export dari DLL adalah pointer ke Form yg baru di-create. Cuma emang dgn DLL , RTTI-nya ngga bisa kebaca. Kode begini ngga pernah True: if DllForm.Controls[i] is TMemo dedangkan dgn begini OK: if DllForm.Controls[i].ClassName = 'TMemo'

// di Dll (dpr file)
exports
	SetDLLApplication, ResetDLLApplication,
	CreateNewForm;

// di unit DLL
function CreateNewForm:TForm;
procedure SetDLLApplication(A: TApplication);
procedure ResetDLLApplication;

var
	OldHandle: TApplication;

implementation
uses
	unitFrmYgDiinginkan;
procedure SetDLLApplication(A: TApplication);
begin
	OldHandle := Application;
	Application := A;
end;
procedure ResetDLLApplication;
begin
	Application := OldHandle;
end;
function CreateNewForm:TForm;
begin
	Result := TfrmYgDiinginkan.Create(Application);
end;


// di Aplikasi utama:

type
	TShowDllFormdProc = function:TForm;
	TResetDLLApplicationProc = procedure;
	TSetDLLApplicationProc = procedure(A: TApplication);
function OpenMyDll: Boolean;
procedure CloseMyDll;
procedure SetDLLApplication;
procedure ResetDLLApplication;
var
	frmMain: TfrmMain;
	GDLLHandle: THandle;
  DllMemo: Tmemo;

implementation
{$R *.DFM}

function OpenMyDll: Boolean;
begin
	if (GDLLHandle = 0) then
	begin
		GDLLHandle := LoadLibrary('MdiDll');
		if (GDLLHandle = 0) then Result := False else Result := True;
	end
	else Result := True;
	if (Result) then SetDLLApplication;
end;
procedure CloseMyDll;
begin
	if (GDLLHandle <> 0) then
	begin
		ResetDLLApplication;
		FreeLibrary(GDLLHandle);
		GDLLHandle := 0;
	end;
end;
procedure SetDLLApplication;
var
	SetDLLApplication: TSetDLLApplicationProc;
begin
	SetDLLApplication := GetProcAddress(GDLLHandle, 'SetDLLApplication');
	SetDLLApplication(Application);
end;
procedure ResetDLLApplication;
var
	ResetDLLApplication: TResetDLLApplicationProc;
begin
	ResetDLLApplication := GetProcAddress(GDLLHandle, 'ResetDLLApplication');
	ResetDLLApplication;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DllMemo := nil;
	if (not OpenMyDLL) then
  begin
    ShowMessage('Unable to open DLL.');
	end;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  DllMemo:=nil;
  CloseMyDLL;
end;
procedure TfrmMain.btnNewDllFormClick(Sender: TObject);
var
	ShowDllFormProc: TShowDllFormdProc;
  DllForm:TForm;
  i: integer;
begin
	ShowDllFormProc := GetProcAddress(GDLLHandle, 'CreateNewForm');
	DllForm:=ShowDllFormProc;
  for i:=0 to DllForm.ControlCount-1 do
     if DllForm.Controls[i].ClassName='TMemo' then
        DllMemo := TMemo(DllForm.Controls[i]);
  DllForm.Show;
end;

procedure TfrmMain.btnTambahBarisClick(Sender: TObject);
begin
  if (DllMemo <> nil) then
     DllMemo.Lines.Add('Tambah baris baru');
end;


user image
more 12 years ago

EkoIndri

tul mas.. kemarin aku coba pakai ini: Cuma emang dgn DLL , RTTI-nya ngga bisa kebaca. Kode begini ngga pernah True: if DllForm.Controls[i] is TMemo tak coba deh ntar caranya diatas makasih sebelumnya...
user image
more 12 years ago

DelphiExpert

Cuma emang dgn DLL , RTTI-nya ngga bisa kebaca. Kode begini ngga pernah True: if DllForm.Controls[i] is TMemo
tahukah anda kenapa code tersebut tidak pernah menghasilkan TRUE? :D
user image
more 12 years ago

EkoIndri

kemarin sebenarnya saya mirip dengan itu if Components[indek].ClassType = TMemo then @DE ada penjelasan kah?
user image
more 12 years ago

DelphiExpert

jawaban simplenya karena beda module dng demikian beda virtual-method table, beda class registry table... dll... if Components[indek].ClassType = TMemo then --> saya rasa ini juga tidak bisa digunakan (jika dieksekusi di Host app / DLL form lain)... karena masing2 module punya Class Table sendiri... jadi pengecekan object A hanya relevan jika dilakukan dlm module dimana object A tersebut dibuat... if DllForm.Controls[i].ClassName = 'TMemo' --> seperti @mat_koder bilang; itu bisa anda gunakan...
user image
more 12 years ago

EkoIndri

thanxs atas penjelasannya
more ...
  • Pages:
  • 1
  • 2
Share to

Random Topic

Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com