[Delphi] Problem z wczytaniem zdjęcia przez DLL.

0

Witam.
Mam następujący problem:
Chcę aby mój DLL zmienił zdjęcie w Form2 na ('data/pustynia/pustynia.bmp'). Co zrobić gdzie mam błąd??
Okno form2 mi otwiera lecz nie wczytuje zdjęcia. Ten Form2 jest zamieszczony w programie a nie w DLL'u. Oto kod:

library p2level;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,
  Unit2 in 'unit2.pas' {Form2};

procedure Pustynia; stdcall;
begin
form2 := TForm2.Create(Application);
form2.aaImage1 := TImage.Create(Application);
Form2.aaImage1.Picture.LoadFromFile('data/pustynia/pustynia.bmp');
Form2.Free;
Form2.aaImage1.Free;
end;

exports
Pustynia name 'Pustynia';

begin
end.

Proszę o pomoc.

Edit///
Zauważyłem że jak Usunę z programu Form2.ShowModal, a dam go w DLL'u to wyświetla mi sam Form2 bez zadnych ustawień programu.

0

Proszę o pomoc. Co w kodzie jest źle???. Już w wielu poradnikach szukałem ale nie znalazłem.

0

a gdybyś podał pełną ścieżkę do pliku .bmp ?

pzdr.

0

to nic nie daje ponieważ zrobiłam tak samo w programie i działało.
To jest chyba coś źle w kodzie. Dopiero zaczynam robić w DLL'u i nie wiem jak p[rzez DLL sterować innymi Formami.

Edit///
Spróbowałem ale i tak nie działa :(

0

Proszę o pomoc ponieważ chciałbym dokończyć program a ten błąd mnie wstrzymuje. Szukałem tu na forum ale nie znalazłem podobnego problemu.

0

jak chcesz wiedzieć co jest źle to źle jest wszystko między begin a end. Nie chce mi się poraz kolejny pisać jak to ma wyglądać bo było na forum nie raz a i w google jest od metra artów na ten temat

0

To ja coś napiszę: stworzenie Form2 przez DLL w ten sposób powoduje powstanie 2 niezależnych okien Form2 - jednego w aplikacji głównej, drugiego, osobnego przez bibliotekę. Nie podłączasz się w ten sposób do formy z aplikacji.

To o czym Misiekd wspominał w sposób powiedzmy szorstki, jak mi się zdaje, to różnica między aplikacją a bibliotekę w dwóch podstawowych obiektach: Screen, Application. Niestety przyznać mu muszę rację, że między Twoim begin a end jest wszystko źle.

Proponuję w eksportowanej funkcji jako parametr pobierać obiekt bitmapy z aplikacji i go zmieniać - dopiero w aplikacji zmieniać na tej podstawie Image; będzie to coś takiego:

Aplikacja:

unit Unit1;

interface

uses
  Windows, Forms, Graphics, Controls, StdCtrls, Classes, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

  TChange = procedure(BMP:TBitmap);

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var Change:TChange;
    DLL:THandle;
    BMP:TBitmap;
begin
DLL:=LoadLibrary('dll.dll');
if (DLL<>INVALID_HANDLE_VALUE) then
  begin
  Change:=GetProcAddress(DLL, 'Change');
  if (@Change<>nil) then
    begin
    BMP:=TBitmap.Create;
    Change(BMP);
    Image1.Picture.Assign(BMP);
    BMP.Free;
    end;
  FreeLibrary(DLL);
  end;
end;

end.

Biblioteka dll.dll:

library dll;

uses Graphics;

{$R *.res}

procedure Change(BMP:TBitmap);
begin
BMP.LoadFromFile('C:\WINDOWS\Web\Wallpaper\Idylla.bmp');
end;

exports Change;

begin
end.
0
Szczawik napisał(a)

To ja coś napiszę: stworzenie Form2 przez DLL w ten sposób powoduje powstanie 2 niezależnych okien Form2 - jednego w aplikacji głównej, drugiego, osobnego przez bibliotekę. Nie podłączasz się w ten sposób do formy z aplikacji.

znaczy screen i application mają różne, ale będzie to działać, przynajmniej w ograniczonym zakresie

To o czym Misiekd wspominał w sposób powiedzmy szorstki, jak mi się zdaje, to różnica między aplikacją a bibliotekę w dwóch podstawowych obiektach: Screen, Application. Niestety przyznać mu muszę rację, że między Twoim begin a end jest wszystko źle.

chodziło mi o sam schemat - tworzenie formy, załadowanie bitmapy, usunięcie formy - przecież to się kupy nie trzyma i niby jak ma robić to co sobie autor założył?
jeszcze wypadało by obrazkowi parenta przypisać i już na sam koniec zlikwidować AV, któy tam jest na 100% -
Form2.Free;
Form2.aaImage1.Free; <- odwołąnie do wcześniej zwolnionego obiektu

0

Dziękuje za pomoc.

Form2.Free;
Form2.aaImage1.Free; <- odwołąnie do wcześniej zwolnionego obiektu

Tu nie wiedziałem co robić więc już kombinowałem :)

jak chcesz wiedzieć co jest źle to źle jest wszystko między begin a end. Nie chce mi się poraz kolejny pisać jak to ma wyglądać bo było na forum nie raz a i w google jest od metra artów na ten temat

W google szukałem ale znaleźć nie mogłem, a w Artykułach było to opisane w małym stopniu.

Szczawik: Dzięki za kod bo w końcu już wiem o co chodzi :) (ja najlepiej rozumiemać jak zobaczę kod :) ) Potrzebowałem tego ponieważ tworzę grę o czołgach i chciałem by dodatkowe plansze(ich procedury) były zapisywane w bibliotekach DLL. Jak Gra mi wyjdzie to ją pokarze :D .

Proszę o zrozumienie mnie ponieważ zaczynam programować w Bibliotekach DLL.

Jeszcze raz dziękuję. Temat można już zamknąć.

0

choćby tematycznie http://delphi.about.com/od/objectpascalide/a/dlldelphi.htm

jeśli liczysz na text po polskiemu to cieniutko będzie

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