[Delphi] Dll i zmiana położenia komponentów

0

Jak za pomocą biblioteki DLL zmienić rozmiar i położenie komponentów w programie który obsługuje tą bibliotekę?

Daję przykład: :P
Mam program w którym jest komponent "Button1", ładując bibliotekę DLL (która ma funkcję modyfikującą ustawienia danego komponentu - w tym wypadku jest nim Button1), button zmienia swój rozmiar i położenie na fomie.

Czy wiecie jak to zrobić?

0

bierzesz handle buttona (FindWindow) i SetWindowPos chyba ;]

0

A moży by ktoś tutaj jakąś procedurkę wrzucił :]

0

to chyba na tym nie polega zebym Ci wszystko podal ;) od czego masz google?
podalem nazwy funkcji + f1

aa i poza tym: jesli to Twoja dll'ka i Twoj program to mozesz napisac specjalna funkcje zwracajaca handle lub zmieniajaca przycisk

np w programie:

function ReturnCtrlHandle(Ctrl: integer): THandle;
begin
  case Ctrl of
  1:  Result := button1.handle;
  else 
    Result := 0;
  end;
end;

// do tego bedziesz potrzebowal jakiejs funkcji w dll'u (np Load) w ktorej w parametrze bedziesz przekazywal pointer do tej funkcji
// np:
var 
  Proc: function (Ctrl: integer): THandle;
  hLib: THandle;
begin
hLib := LoadLibrary('plug.dll');
if hLib <> 0 then
begin
  @Proc := GetProcAddress('Load');
  if @Proc <> nil then
    Proc(@ReturnCtrlHandle);
end;

// no i w plugu odpowiednie wykonanie :F
var
  GetCtrlHandle: function (Ctrl: integer): THandle;

procedure Load(Proc: Pointer);
var
  Btn1: THandle;
begin
  @GetCtrlHandle := Proc;
  Btn1 := GetCtrlHandle(1);
  // no i tu majac handle mozesz uzywac winapi do kontroli :F
end;

// no i nie mozna zapomniec o eksporcie procedury Load

to jest oczywiscie tylko jedno z wielu mozliwych wykonan wystarczy troche pomyslec... ahaaa i nie gwarantuje ze kod bedzie dzialal bo pisze z pamieci bez delphi :F

0

Chciałem skompilować ten kod, który mi dałeś i przy kompilacji cały czas wyskakuje mi błąd przy tej linijce:

 @Proc := GetProcAddress('Load');

PS. Szukałem długo na Googlach ale nic ciekawego nie znalazłem :( Poszukałem trochę po angielskich stronach, ale angielskiego za dobrze nie znam.

0
CPPBuilder napisał(a)

Chciałem skompilować ten kod, który mi dałeś i przy kompilacji cały czas wyskakuje mi błąd przy tej linijce:

 @Proc := GetProcAddress('Load');

PS. Szukałem długo na Googlach ale nic ciekawego nie znalazłem :( Poszukałem trochę po angielskich stronach, ale angielskiego za dobrze nie znam.

a wystarczyło F1 wcisnąć!!

@Proc := GetProcAddress(hLib, 'Load');
0

Za dobrze sie na tym nie znam [wstyd] ale chyba coś źle zrobiłem bo znowu się pojawia błąd ;(

0

i bedzie sie pojawial jesli bez zastanowiania sie bedziesz przepisywal kod innych ;)

0

Tak się zastanawiam czy nie prościej i szybciej by było użyć zasobów. :P Ten Dll który robię ma być skórką do programu. Z grafiką sobie poradziłem ale chciałbym, aby komponenty dopasowywały się do rozmiaru skórek (zmieniały swój rozmiar i położenie). Najprościej było by zastosować plik INI (zawierający ustawienia komponentów) i umieścić go obok DLLa se skórką (a program by wczytywał jednocześnie skórkę i plik INI), ale wolałbym aby skórka i ustawienia komponentów znajdował się w tym samym pliku DLL.

0

hmm ciekawe.. ale ja jakbym mial robic skorowanie do mojego programu to na pewno nie umiescilbym skorek w dll'ach.. pokaz mi programiste ktory jest dobrym grafikiem i dobrego grafika ktory rowniez jest dobrym programista :P no dobra szablon bys udostepnil ale komu chcialo by sie instalowac delphi tylko zeby skompilowac skorke? :P

to by bylo dobre gdy zakladasz ze nitk nie bedzie robil dodatkow do Twojego programu..
moze ja sie tam nie znam ale na Twoim miejscu (chcac jeden plik) zrobilbym to za pomoca zip'ow (ze zmienionym rozszerzeniem) a w nich wszystkie grafiki + plik xml/ini z informacjami gdzie komponenty maja sie znajdowac

  • taki bajer ze w tym raczej nie umiesci sie szkodliwego kodu dla usera
0

bidok, nie wiem czemu tak kombinujesz z tymi pointerami i handalmi... przeciez mozna bezposrednio podac obiekt, mi przynajmniej zadzialalo, przed chwila sprawdzalem.

DLL:

library Testdll;

uses sysutils, windows, classes, StdCtrls;

procedure hello(but:tbutton);
begin
but.left:=0;
end;

exports hello;

begin
end.

APP:
[...]

procedure hello(but:tbutton); external 'dll.dll';

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
hello(button1);
end;

[...]
I po klopocie :P

A jak chce tak zrobic to niech robi, przeciez pisze, ze calej skorki umieszczac tam nie chce, tylko zrobic taki mini parser, czytajacy ini, wczytujacy grafike itp...

0
wesoledi napisał(a)

bidok, nie wiem czemu tak kombinujesz z tymi pointerami i handalmi... przeciez mozna bezposrednio podac obiekt, mi przynajmniej zadzialalo, przed chwila sprawdzalem.

masz duużżżooo szczęścia, że i się to nie wysypało. Pozytaj o tym co można (i jak) przekazywać do/z dlli

0

Nie boj sie, wiem co mozna a co nie..
Ale sa rzeczy ktore mozna, a skoro dziala prosta metoda to po isc na okolo?
(z forma juz tak z tego co pamietam nie zrobisz)

0
wesoledi napisał(a)

Nie boj sie, wiem co mozna a co nie..
Ale sa rzeczy ktore mozna, a skoro dziala prosta metoda to po isc na okolo?
(z forma juz tak z tego co pamietam nie zrobisz)

do pierwszego AV w najmniej spodziewanym momencie.

0
wesoledi napisał(a)

A jak chce tak zrobic to niech robi, przeciez pisze, ze calej skorki umieszczac tam nie chce, tylko zrobic taki mini parser, czytajacy ini, wczytujacy grafike itp...

Wierz mi lub nie ale w zip'ie/rar'ze/innym archiwum poszlo by to o wiele szybciej + wieksze prawdopodobienstwo ze ktos cos dorobi ;]

0

Dzięki! Wszystko już ładnie działa!!!

0

Mam jeszcze jedno pytanie:

procedure hello(but:tbutton); external 'dll.dll';

Czy "external" można zastąpić czymś innym. Bo chciałbym aby Dll był wczytywany z ListBox'a. Przez "external" tego się nie da zrobić.

0
CPPB napisał(a)

Mam jeszcze jedno pytanie:

procedure hello(but:tbutton); external 'dll.dll';

Czy "external" można zastąpić czymś innym. Bo chciałbym aby Dll był wczytywany z ListBox'a. Przez "external" tego się nie da zrobić.

dynamiczne ładowanie dlli

0

ktos tu chce isc na latwizne i nie zwaza na AV ;] no coz przynajmniej mam czyste sumienie ze sie staralem.

// ps.: Misiekd wlasnie mialem klikac 'Publikuj' jak dostalem info o nowej poczcie :P
wyprzedziles mnie o pare sekund ^^

0

CPPBuilder, proponowal bym wpierw zajac sie prostszymi zabawiz DLL'kami, nie rzucac sie od razu na gleboka wode :)

Przejrzyj to:
Biblioteki DLL

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