Problem z komponentem XPManifest

0

Utworzyłem sobie bibliotekę (.dll), która zawiera formularz z komponentem TGroupBox. Następnie tworze program, z którego chce uruchomić tą bibliotekę. Jeżeli program uruchamiający (główny) zawiera komponent TXPManifest to jest problem. Jeżeli uruchomię z programu głównego bibliotekę, później ją zamknę. To jest w porządku, ale jak chce następnie zamknąć program główny to wyskakuje błąd ACCESS VIOLATION. Jak wyrzuce XPManifest z głównego to jest dobrze. Co jest nie tak. Pomóżcie bo już głowa mi od tego pęka. [???] </b></i>

0

Po uruchomieniu programu TXPManifest dostosowuje wygląd komponentów na podobę XP - i czyni to wtedy gdy program uruchamiasz (podczas kreowania)
A że wywołujesz okienko z biblioteki, to kreowane jest po zakończeniu procedur zawartych w TXPmanifest - i w tym momencie gdzieś zachodzi błąd bo wygląd tego okna nie jest odświeżany.
S<ort>prubój</ort> tak: tam gdzie wywołujesz bibliotekę daj opcje TXPManifest na False i następnie na True - może to coś da ?
Albo wyłącz opcje zmiany wyglądu dla TGroupBox we właściwościach TXPManifest

0

Albo zamiast uzywać komponentu, zrób to.

0

Próbowałem rozwiązać ten problem poprzez dołączenie pliku nazwa_programu.exe.manifest, tak jak radził Qyon, ale to samo. Jeżeli uruchomię biblioteke, to przy wyjściu z programu głównego, znów wyskakuje błąd:
Instrukcja odwołuje się do pamięci pod jakimś adresem. Pamięć nie może być "read"
Jeśli chodzi o radę użytkownika Inter, to nie zabardzo wiem jak i którą zmienić opcje TXPManifest. Z właściwosci Published ma tylko "Tag" i "Name".
Pozdrawiam

0

możliwe że nie masz poprawki do Delphi odpowiedniej zainstalowanej. Miałem tak samo tyle że przy ListView. Wejdź na borland.com i poszukaj, tam gdzieś są poprawki do Delphi. One usuwają m.in. ten błąd.

0

Nakladki nie moge pobrac, bo nie mam zarejestrowanego Delphi. Przesylam kod zrodlowy biblioteki:

library Project1;

{ 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
  ShareMem,
  SysUtils,
  Windows,
  Forms,
  Dialogs,
  Classes,
  DBTables,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

procedure UPkw;
begin
  Form1:=TForm1.Create(Application);
  Form1.ShowModal;
  Form1.Free;
end;

exports UPkw name 'UPkw';
end.

Zalaczam kod formularza z biblioteki
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, Menus, ImgList, DBActns, ActnList, StdActns, StdCtrls,
ComCtrls,
  Buttons, ExtCtrls, ToolWin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    GroupBox1: TGroupBox;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

Zalaczam rowniez kod programu wywolujacego biblioteke:

unit u2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, StdCtrls, UMyZBior, XPMan;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    XPManifest1: TXPManifest;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure UPkw; external 'DLL.dll' name 'UPkw';

procedure TForm1.Button1Click(Sender: TObject);
begin
  UPkw;
end;

end.

Moze jest jakis blad w kodzie i dlatego nie chce XPManifest wspolpracowac z dllkiem. Prosze o pomoc [???]

// W przyszłości używaj tagów <code class="delphi"></code> - Q

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