DLL i TPageControl

0

Witam oto moje dll:

library show;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  Unit1 in 'Unit1.pas' {Form1},
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  Menus,
  ComCtrls,
  XPMan,
  StdCtrls,
  OleCtrls,
  SHDocVw_TLB,
  INIFiles,
  ShellApi,
  ExtCtrls;

{$R *.res}


procedure ss(Form1: TForm); stdcall;
var
PageControl1: TPageControl;
begin
  Form1.PageControl1.Pages[1].Show;
  Form1.PageControl1.Pages[2].Show;
  Form1.PageControl1.Pages[0].Show;
  end;

  exports
  spr name 'ss';

  begin
  end.

Lecz niestety:
[Error] strdcalc.dpr(41): Undeclared identifier: 'PageControl1'
Jak to zdefiniować aby komponent z form1 mógł być użyty w dll?

Dziekuję! [browar]

0

nie powinieneś mieć czasem w parametrze TForm1 a nie TForm ? jak się nazywa Twoja klasa formularza ?

0

teraz lepiej... kompiluje się ale podczas uruchamiania procedury err:
user image

0

podeślij więcej kodu, moduł w którym to odpalasz ?

0

a formularz swoją drogą musiałbyś najpierw utworzyć....

0

Jest tworzony w aplikacji exe i chcę aby DLL odwoływał się do komponentów w exe tj. label, pagecontrol ...

0

Wiecie o co chodzi. Że DLL odwołuje się np.

Edit1.Text:='ZDLL';

Jak to zdefiniować...?!

Nie pasuje
Form1.Edit1.Text itp. :>

0

i co panowie eksperci?

0

Nie jestem ekspertem, więc mogę się mylić ale jak chcesz aby Twoja dll tworzyła na formatce programu
głownego jakieś komponenty - to zrób to w taki sposób jak pokazałem poniżej w przykładzie. Masz tam
również podany przykład ustawiania tekstu dla komponentu Edit. O ile o to Tobie chodzi, bo się pogubiłem.

library Project2;

uses
  Windows, Controls, Forms, StdCtrls, Graphics;

{$R *.res}

procedure TworzGroupBox(Komponent_Rodzic: TForm; Handle: HWND);
var
  GroupBox1 : TGroupBox;
begin
  with Komponent_Rodzic do
  begin
    GroupBox1 := TGroupBox.Create(Komponent_Rodzic);
    GroupBox1.ParentWindow := Handle;
    GroupBox1.Color := clBtnFace;
    GroupBox1.Name := 'Grp';
    GroupBox1.Caption := 'Test';
  end;
end;

procedure UstawEdit(Edit: TEdit);
begin
  Edit.Text := 'cosik';
end;

exports
  TworzGroupBox,
  UstawEdit;
begin
end.
0

Masz 2 opcje do wyboru albo przekazywać sam komponent lub skopiować całą klasę TForm1 i ją przesyłać.

0

No prawie mnie zrozumiałeś. Ale dzięki za chęci.

Sytuacja jest taka.

Mam komponent już na Form1. Np. Edit1 i teraz chcę aby dll zmienił Form1.Edit1.Text :>

Pozdrowionka

0

No to tak jak pisałem, tekst też może być parametrem dla procedury, ale nie ma ona w takim przypadku - w
mojej opinii - większego sensu, bo równie dobrze można ustawić tekst poprzez kod głównej aplikacji, ale gdy
dllka ma wykonać na przykład jakieś specyficzne operacje, pokazując wynik tekstowy w jakimś Editcie to ok.

procedure UstawEdit(Edit: TEdit; Text: PChar);
begin
  Edit.Text := Text;
end;
0

mam tak w dll:

procedure zmiana(Edit1: TEdit;Form1: TForm1);
begin
Form1.Edit1.Text:='GZ';
  end;

a w programie daje onClick np. dla buttona

zmiana();

i nic ani drgnie napis ;(

0

A nie możesz dać w dll po prostu:

procedure Zmiana(Edit1: TEdit);
begin
  Edit1.Text := 'GZ';
end;

A póxniej w kodzie programu:

  Zmiana(Form1.Edit1);

Ale nawet jak coś to Twój wariant kodu działa ok. Pewnie u siebie nie wyeksportowałeś funkcji albo ją w
ogóle nie ładujesz ani statycznie ani dynamicznie. Ja u siebie w dll mam teraz tak jak napisałeś u siebie,
a w kodzie programu ładuje funkcję starycznie oraz wywołuje ją później i podany Edit zmienia tekst na GZ:

procedure Zmiana(Edit1: TEdit;Form1: TForm1); external 'project2.dll';
{...}
procedure TForm1.Button3Click(Sender: TObject);
begin
  Zmiana(Edit1, Form1);
end;

EDIT: i oczywiście nie możesz dać samo Zmiana() bo to się nie skompiluje, gdyż funkcja wymaga parametrów.

0

procedure Zmiana(Edit1: TEdit;Form1: TForm1); external 'project2.dll';
zmieniłem na
procedure Zmiana(Edit1: TEdit); external 'project2.dll';
i działa [!!!] thx

1 użytkowników online, w tym zalogowanych: 0, gości: 1