🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
21 messages
21 total messages Started by konsul41 Fri, 13 May 2016 20:58
Problem z BPL
#344940
Author: konsul41
Date: Fri, 13 May 2016 20:58
65 lines
1959 bytes
Delphi XE2

Dynamicznie ładowany BPL

Wspólny moduł


unit BASE;
...
type
   TBase = class(TPersistent)
   private
     procedure SetConnection(Connection : TZConnection);virtual; abstract;
   public
     property Connection : TZConnection write SetConnection;
     procedure test();virtual;

   end;
...

BPL
...
type
   TDokument = class(TBase)
   public
     procedure test(); Overload;
   end;
...

initialization
   RegisterClass(TDokument);

finalization
   UnRegisterClass(TDokument);
end.

EXE

W EXE włączona opcja runtime pakage
Ładowanie bpl przy starcie i sprzątanie przy zamknięciu.

...
var AClass: TPersistentClass;
     klasa : TBaseDoc;
begin
    AClass := GetClass('TDokument');



    if AClass <> nil then
      with AClass.Create()as TBase do
      begin
        test;
      end;
end;
...
Jeżeli robię
with AClass.Create()as TBase do dostaje błąd
Invalid Class typeCast

gdy zrobię
with AClass.Create()as TPersistent do
nie mam błędu ale to mi nic nie daje.

Jak to się powinno zrobić?
Re: Problem z BPL
#344941
Author: Mikołaj 'Virion' Milewski
Date: Fri, 13 May 2016 21:50
9 lines
1603 bytes
W dniu piątek, 13 maja 2016 22:58:49 UTC+2 użytkownik kons...@wp.pl napisał:

> Jak to się powinno zrobić?

Potrzebujesz jeszcze jednego BPLa, który będzie zawierał wspólny unit (moduł). Twój BPL i EXE powinny używać tego wspólnego BPLa - a nie, każdy mieć kopię wspólnego unita.

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344942
Author: konsul41
Date: Mon, 16 May 2016 07:06
70 lines
2551 bytes
W dniu 13-05-2016 o 23:50, Mikołaj 'Virion' Milewski pisze:
> W dniu piątek, 13 maja 2016 22:58:49 UTC+2 użytkownik kons...@wp.pl napisał:
>
>> Jak to się powinno zrobić?
>
> Potrzebujesz jeszcze jednego BPLa, który będzie zawierał wspólny unit (moduł). Twój BPL i EXE powinny używać tego wspólnego BPLa - a nie, każdy mieć kopię wspólnego unita.
>

Zrobiłem jak radziłeś i nie działa tak jak trzeba.

Jest w oddzielnym bpl klasa TBase
W mojej "wtyczce" ładowanej dynamicznie jest
requires
...
   BPLPodDzielenia;

contains
   Dokument1 in 'Dokument1.pas';


do exe dodany jest do runtime

i kompiluje się prawidłowo

hierarchia klas

TBase = class(TPersistent)  //wspólny moduł
...
procedure TBaseDoc.test;
begin
   ShoWMessage('testowa 1');
end;
...

TDokument = class(TBaseDoc) //w bpl ładowanym dynamicznie
...
procedure TDokument.test;
begin
   ShowMessage('test');
end;
...

kod w exe

...
procedure Tmain.Button1Click(Sender: TObject);
var AClass: TPersistentClass;
     klasa : TBaseDoc;
begin
    AClass := GetClass('TDokument');
    if AClass <> nil then
      with AClass.Create() as TBaseDoc do
      begin
        test;
      end;
end;
...

odpowiedź programu 'testowa 1'
uruchamiane są funkcje z klasy TBase

Pytanie co jest nie tak?





---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344961
Author: szemrany
Date: Mon, 16 May 2016 08:38
18 lines
1799 bytes
On Fri, 13 May 2016 14:50:36 -0700 (PDT), Mikołaj 'Virion' Milewski wrote:

> W dniu piątek, 13 maja 2016 22:58:49 UTC+2 użytkownik kons...@wp.pl napisał:
> 
>> Jak to się powinno zrobić?
> 
> Potrzebujesz jeszcze jednego BPLa, który będzie zawierał wspólny unit (moduł). Twój BPL i EXE powinny używać tego wspólnego BPLa - a nie, każdy mieć kopię wspólnego unita.

To jest reguła? Że kod wspólny używany w exe i w bpl musi być w drugim bpl?
Pytam, bo nie mam doświadczeń z bplami, ale brzmi to nieco kuriozalnie. Bo
tak na logikę, skoro ten kod wspólny jest w exe, a nie ma go w tym
ładowanym bpl to bpl powinien korzystać z kodu execa. Nie tak?

-- 
howgh
szemrany
"Zrozumienie umożliwia zastąpienie nieracjonalnych działań lub bezradności
przez działania racjonalne." M.Mazur, ojciec polskiej szkoły cybernetyki
Re: Problem z BPL
#344943
Author: Mikołaj 'Virion' Milewski
Date: Mon, 16 May 2016 12:41
5 lines
1422 bytes
Virtual?

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344982
Author: Mikołaj 'Virion' Milewski
Date: Mon, 16 May 2016 12:45
12 lines
2033 bytes
W dniu poniedziałek, 16 maja 2016 10:38:53 UTC+2 użytkownik szemrany napisał:

> To jest reguła? Że kod wspólny używany w exe i w bpl musi być w drugim bpl?
> Pytam, bo nie mam doświadczeń z bplami, ale brzmi to nieco kuriozalnie. Bo
> tak na logikę, skoro ten kod wspólny jest w exe, a nie ma go w tym
> ładowanym bpl to bpl powinien korzystać z kodu execa. Nie tak?

BPL-plugin musi zależeć (compilation time dependency) od BPLa-bazy, bo dziedziczy po typach z BPLa-bazy. Ja nie umiem dodać EXEca do required, ale może istnieje jakiś sposób na osiągnięcie tego, co piszesz - ja go nie znam.

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344944
Author: konsul41
Date: Tue, 17 May 2016 06:29
82 lines
2892 bytes
W dniu 16-05-2016 o 14:41, Mikołaj 'Virion' Milewski pisze:
> Virtual?
>
Zrobiłem tak:
Po zmianach usuwam wspólny bpl z sekcji requires tam gdzie trzeba i z 
build runtime i próba kompilacji następnie ponownie dodaje i kompilacja 
prawidłowa
(to rak na wszelki wypadek aby ścieżki były prawidłowe).

wspólny bpl
...
   TBase = class(TPersistent)
   private
     FConnection :TZConnection;
     procedure SetConnection(Connection : TZConnection);virtual;
   protected
     procedure ImplementationOftest; virtual;
   public
     property Connection : TZConnection write SetConnection;
     procedure test();virtual;
   end;
...
procedure TBase.test;
begin
   ShoWMessage('testowa 1');
   ImplementationOftest();
   test;
...

ładowany dynamicznie bpl
...
   TDokument = class(TBaseDoc)
   procedure ImplementationOftest; virtual;
   public
     procedure test(); Virtual;
   end;
...
procedure TDokument.test;
begin
   ShowMessage('test');
end;

initialization
   RegisterClass(TDokument);

finalization
   UnRegisterClass(TDokument);
end.


EXE

procedure Tmain.Button1Click(Sender: TObject);
var AClass: TPersistentClass;
     klasa : TBaseDoc;
begin
    AClass := GetClass('TDokument');
    if AClass <> nil then
      with TPersistentClass(AClass).Create() as TBaseDoc do
      begin
        test;
      end;
end;


Błąd inwalid class typecast

Link do archiwum ze spakowanymi 3 projektami
Exe ./KsiegiKS
Wspólny ./ProjektyPlugin/BPLPODDzielenia
Ładowany dynamicznie ./ProjektyPlugin/DokSYS








---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344977
Author: wloochacz
Date: Tue, 17 May 2016 06:32
25 lines
2311 bytes
W dniu 2016-05-16 o 10:38, szemrany pisze:
> On Fri, 13 May 2016 14:50:36 -0700 (PDT), Mikołaj 'Virion' Milewski wrote:
>
>> W dniu piątek, 13 maja 2016 22:58:49 UTC+2 użytkownik kons...@wp.pl napisał:
>>
>>> Jak to się powinno zrobić?
>>
>> Potrzebujesz jeszcze jednego BPLa, który będzie zawierał wspólny unit (moduł). Twój BPL i EXE powinny używać tego wspólnego BPLa - a nie, każdy mieć kopię wspólnego unita.
>
> To jest reguła? Że kod wspólny używany w exe i w bpl musi być w drugim bpl?
Nie, skąd...
Ale jak zrobisz uses danego modułu, który jest w exe, to Ci kompilator 
doda (wkompiluje) ów moduł do BPL. No chyba że umiesz dodać do sekcji 
requires BPLa moduł, który jest tylko w EXE.
Ja nie umiem.
Mikołaj też raczej nie potrafi...

> Pytam, bo nie mam doświadczeń z bplami, ale brzmi to nieco kuriozalnie. Bo
> tak na logikę, skoro ten kod wspólny jest w exe, a nie ma go w tym
> ładowanym bpl to bpl powinien korzystać z kodu execa. Nie tak?
Tak, jasne.
Ale...

-- 
wloochacz
Re: Problem z BPL
#344992
Author: wloochacz
Date: Tue, 17 May 2016 06:34
9 lines
1375 bytes
W dniu 2016-05-17 o 08:32, wloochacz pisze:
> W dniu 2016-05-16 o 10:38, szemrany pisze:
>> On Fri, 13 May 2016 14:50:36 -0700 (PDT), Mikołaj 'Virion' Milewski
/ciach/
Wybaczcie, piszę to samo co Virion.
Kawa i pobudka potrzebna...

-- 
wloochacz
Re: Problem z BPL
#344946
Author: wloochacz
Date: Tue, 17 May 2016 06:41
26 lines
1959 bytes
W dniu 2016-05-17 o 08:29, konsul41@wp.pl pisze:
>
> procedure Tmain.Button1Click(Sender: TObject);
> var AClass: TPersistentClass;
>      klasa : TBaseDoc;
> begin
>     AClass := GetClass('TDokument');
>     if AClass <> nil then
>       with TPersistentClass(AClass).Create() as TBaseDoc do
>       begin
>         test;
>       end;
> end;
      if AClass <> nil then
        with TPersistent(AClass).Create() as TBaseDoc do
        begin
          test;
        end;
A jak będzie dalej występował błąd, to przepisz ten kod:
   with TPersistent(AClass).Create() as TBaseDoc do
Na taki, abyś w debugerze mógł dokłądnie złapać, o które rzutowanie chodzi.
Bo, być może, ten warunek nie jest spełniony: 
TPersistent(AClass).Create() is TBaseDoc

-- 
wloochacz
Re: Problem z BPL
#344945
Author: konsul41
Date: Tue, 17 May 2016 07:41
20 lines
1879 bytes
W dniu 17-05-2016 o 08:41, wloochacz pisze:
> with TPersistent(AClass).Create() as TBaseDoc do




Wyczyściłem wszystkie możliwe kompilowane rzeczy dotyczące bpl 
współdzielonego poustawiałem ponownie ścieżki i bpl współdzielony 
znajduje się razem z plikiem exe w tym samym katalogu, więc powinno być 
w porządku.


with TPersistent(AClass).Create() as TBaseDoc do <-- Acces Violation

with TPersistentClass(AClass).Create() as TBaseDoc do <-- używana jest 
funkcja klasy TBase

---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344947
Author: Adam Siwoń
Date: Tue, 17 May 2016 08:36
51 lines
2733 bytes
W dniu 2016-05-17 o 08:29, konsul41@wp.pl pisze:
> W dniu 16-05-2016 o 14:41, Mikołaj 'Virion' Milewski pisze:
>> Virtual?
>>
> Zrobiłem tak:
> Po zmianach usuwam wspólny bpl z sekcji requires tam gdzie trzeba i z
> build runtime i próba kompilacji następnie ponownie dodaje i kompilacja
> prawidłowa
> (to rak na wszelki wypadek aby ścieżki były prawidłowe).
>
> wspólny bpl
> ...
>   TBase = class(TPersistent)
>   private
>     FConnection :TZConnection;
>     procedure SetConnection(Connection : TZConnection);virtual;
>   protected
>     procedure ImplementationOftest; virtual;
>   public
>     property Connection : TZConnection write SetConnection;
>     procedure test();virtual;
>   end;
> ...
> procedure TBase.test;
> begin
>   ShoWMessage('testowa 1');
>   ImplementationOftest();
>   test;
> ...

Tu masz TBase

> ładowany dynamicznie bpl
> ...
>   TDokument = class(TBaseDoc)

a tu masz dziedziczenie po TBaseDoc - czemu nie po TBase?

>   procedure ImplementationOftest; virtual;
>   public
>     procedure test(); Virtual;
>   end;
 > [...]
Czemu dla procedur ImplementationOftest i test jest ustawione virtual a 
nie override? Czy kompilator nie zgłasza Ci jakiegoś warninga? Jeśli tak 
to pokaż co. Jeśli możesz to pokaż też kawałek kodu a nie pseudokodu - 
będzie łatwiej Ci pomóc.

-- 
z pozdrowieniami
Adam Siwoń
Re: Problem z BPL
#344948
Author: konsul41
Date: Tue, 17 May 2016 08:44
232 lines
6763 bytes
>
> Tu masz TBase
To jest jedna i ta sama klasa

> Czemu dla procedur ImplementationOftest i test jest ustawione virtual a
> nie override? Czy kompilator nie zgłasza Ci jakiegoś warninga? Jeśli tak
> to pokaż co. Jeśli możesz to pokaż też kawałek kodu a nie pseudokodu -
> będzie łatwiej Ci pomóc.
>
Kod jest w archiwum do którego link załączyłem ale tutaj znowu

base

unit BASEDOC;

interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes, Vcl.Graphics,
   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ZConnection;
type
   TBaseDoc = class(TComponent)
   private
     FConnection :TZConnection;
     procedure SetConnection(Connection : TZConnection);virtual;
   protected
     procedure ImplementationOftest; virtual;
   public
     property Connection : TZConnection write SetConnection;
     procedure test();Overload;

   end;

implementation
{ TBaseDoc }

procedure TBaseDoc.ImplementationOftest;
begin
   ShoWMessage('ImplementationOftest');
end;

procedure TBaseDoc.SetConnection(Connection: TZConnection);
begin
   FConnection:=Connection;
end;

procedure TBaseDoc.test;
begin
   ShoWMessage('testowa 1');
   ImplementationOftest();

end;

end.

Bpl ładowany dynamicznie

unit Dokument1;

interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes, Vcl.Graphics,
   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BaseDOC;
type
   TDokument = class(TBaseDoc)
   public
     procedure test(); virtual;
   end;
implementation

{ TDokument }


procedure TDokument.test;
begin
   ShowMessage('test');
end;

initialization
   RegisterClass(TDokument);

finalization
   UnRegisterClass(TDokument);
end.

EXE

unit main1;

interface

uses
   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes, Vcl.Graphics,
   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ZAbstractConnection,
   ZConnection, BaseDoc;

type
   Tmain = class(TForm)
     Button1: TButton;
     ZConnection1: TZConnection;
     Button2: TButton;
     procedure FormCreate(Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
     procedure DoUnloadPackage(Module: HModule);
   public
     { Public declarations }
   end;

var
   main: Tmain;
   DLLeMAIN    : array of THandle;
implementation

{$R *.dfm}

procedure Tmain.Button1Click(Sender: TObject);
var AClass: TPersistentClass;
begin
    AClass := GetClass('TDokument');
    try
    if AClass <> nil then
      with TComponentClass(AClass).Create(Application) as TBaseDoc do
      begin
        test;
        //ImplementationOftest;
      end;
    Except
      ON E: Exception Do ShowMessage(E.Message);
    end;
end;

procedure Tmain.Button2Click(Sender: TObject);
var AClass: TPersistentClass;
begin
    AClass := GetClass('TForma');
    try
    if AClass <> nil then
      with  TComponentClass(AClass).Create(Application) as TCustomForm do
      begin
        ShowModal;
        Free;
        //test;
        //ImplementationOftest;
      end;
    Except
      ON E: Exception Do ShowMessage(E.Message);
    end;
end;

procedure Tmain.DoUnloadPackage(Module: HModule);
var
   i: Integer;
   M: TMemoryBasicInformation;
begin
   { Make sure there aren't any instances of any
     of the classes from Module instantiated, if
     so then free them.  (This assumes that the
     classes are owned by the application) }

   for i := Application.ComponentCount - 1 downto 0 do
   begin
     VirtualQuery(
       GetClass(Application.Components[i].ClassName),
       M, SizeOf(M));
     if (Module = 0) or
       (HMODULE(M.AllocationBase) = Module) then
       Application.Components[i].Free;
   end;
   UnRegisterModuleClasses(Module);
end;

procedure Tmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   try
     //zwalnianie pluginów
     While Length(DLLeMAIN)>0 do
     begin
       //DLLe[Length(DLLe)-1].fnDisconnect;
       DoUnloadPackage(DLLeMAIN[Length(DLLeMAIN)-1]);
       UnloadPackage(DLLeMAIN[Length(DLLeMAIN)-1]);
       SetLength(DLLeMAIN, Length(DLLeMAIN)-1);
     end;
   except
     Close;
   end;
end;

procedure Tmain.FormCreate(Sender: TObject);
var  SR : TSearchRec;
      Found : Integer;
      hBibl:  THandle;
begin
   //wczytywnie wtyczek
   Found := 
FindFirst(ExtractFilePath(Application.ExeName)+'\plugin\*.bpl', 
faAnyFile, SR); // odnajdz
   while (Found = 0) do // dopoki liczba znalezionych plikow nie bedzie 
rowna 0
   begin
     // Ładuję wtyczkę do pamięci
     {if sr.Name<>'Postgresql.dll' then
     begin
       Found := FindNext(SR); // szukaj dalej
       Continue;
     end; }

     hBibl := 
LoadPackage(PChar(ExtractFilePath(Application.ExeName)+'\plugin\'+SR.Name));
     if  hBibl = 0  then
     begin
       RaiseLastOSError();
       Abort()
     end; // hBibl = 0 ;
     SetLength(DLLeMAIN, Length(DLLeMAIN)+1); // Zwiększamy ilość DLL'ków
     DLLeMAIN[Length(DLLeMAIN)-1] := hBibl; // Przypisz załadowaną 
bibliotekę

     Found := FindNext(SR); // szukaj dalej
   end;
   FindClose(SR); // zakoncz wyszukiwanie
end;

end.

---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344949
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 08:52
17 lines
1832 bytes
W dniu wtorek, 17 maja 2016 10:44:19 UTC+2 użytkownik kons...@wp.pl napisał:
> >
> > Tu masz TBase
> To jest jedna i ta sama klasa

/ciach/

Zadanie domowe: wykuć na blachę znaczenie keywordów:

overload
virtual
override
reintroduce

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344955
Author: konsul41
Date: Tue, 17 May 2016 08:56
65 lines
2454 bytes
Dodatkowo wsadziłem do współdzielonej formy formulaż
na nim przycisk
type
   Tbasedocform = class(TForm)
     Edit1: TEdit;
     Button1: TButton;
     procedure Button1Click(Sender: TObject);virtual;
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   basedocform: Tbasedocform;

implementation

{$R *.dfm}

procedure Tbasedocform.Button1Click(Sender: TObject);
begin
   {}
end;

w bpl ładowanej dynamicznie

unit basedocform2;

interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes, Vcl.Graphics,
   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BaseDocForm1;
type
   TDokument2 = class(TBaseDocForm)

   procedure Button1Click(Sender: TObject);overload;


   end;
implementation


procedure TDokument2.Button1Click(Sender: TObject);
begin
   ShowMessage('toto');
end;

initialization
   RegisterClass(TDokument2);

finalization
   UnRegisterClass(TDokument2);

end.

i po wciśnięciu przyciski wywołanej tak formy przez EXE widzę napis 'toto'
Czyli formy działają prawidłowo.




---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344956
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 09:02
12 lines
1970 bytes
W dniu wtorek, 17 maja 2016 10:56:28 UTC+2 użytkownik kons...@wp.pl napisał:
> Dodatkowo wsadziłem do współdzielonej formy formulaż

formulaRZ ;P

> Czyli formy działają prawidłowo.

Bo prawidłowo użyłeś polimorfizmu - w przeciwieństwie do pierwszego przykładu. Forma czy nie forma, typ bazowy nie ma nic do rzeczy.

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344950
Author: konsul41
Date: Tue, 17 May 2016 09:03
43 lines
2890 bytes
W dniu 17-05-2016 o 10:52, Mikołaj 'Virion' Milewski pisze:
> W dniu wtorek, 17 maja 2016 10:44:19 UTC+2 użytkownik kons...@wp.pl napisał:
>>>
>>> Tu masz TBase
>> To jest jedna i ta sama klasa
>
> /ciach/
>
> Zadanie domowe: wykuć na blachę znaczenie keywordów:
>
> overload
> virtual
> override
> reintroduce
>
Ok.

Przeciążanie funkcji (ang. overloading)

Klauzulą virtual można opatrzeć metodę klasy. Staje się wówczas metodą 
wirtualną. Taką metodę można wówczas przedefiniować w klasie - potomku.

Dyrektywa służącą do przedefiniowywania (nadpisywania) metod. 
Przedefiniowywane mogą być tylko metody klas, oznaczone jako wirtualne 
lub dynamiczne (virtual, dynamic):

Słowo reintroduce związane jest z programowaniem obiektowym, konkretnie 
służy do "przykrywania metod" (pojęcie nazywane reintrodukcją).

Klauzulą overload możemy opatrzyć procedury i funkcje, a także metody. 
Dzięki temu kompilator nie będzie protestował, gdy zadeklarujemy kilka 
funkcji lub procedur o tej samej nazwie! Warunkiem jest jednak to, że 
przeładowywane metody (o tych samych nazwach) muszą różnić się listą 
parametrów (chodzi o to by kompilator mógł rozróżnić po typach 
parametrów z którymi wywoływana jest metoda, którą z przeładowanych 
procedur (lub funkcji) ma użyć).

Dlaczego nie działa mój kod tak jak powinien?


---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344951
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 09:10
11 lines
2231 bytes
W dniu wtorek, 17 maja 2016 11:03:13 UTC+2 użytkownik kons...@wp.pl napisał:

> Dlaczego nie działa mój kod tak jak powinien?

Bo nie stosujesz virtual-on-base - override-on-child, tylko overload-on-base - virtual-on-child, czyli coś totalnie z czapy. W efekcie, klasa bazowa nie jest polimorficzna.

To naprawdę są podstawy. Gdy piszę: wykuć na blachę, nie mam na myśli - umieć znaleźć regułkę na 4programmers. Znaczenie tych keywordów przy tworzeniu polimorficznych hierarchii klas trzeba sobie trwale przyswoić, żeby się nie odbijać od takich kwiatków.

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344952
Author: konsul41
Date: Tue, 17 May 2016 09:19
31 lines
2598 bytes
W dniu 17-05-2016 o 11:10, Mikołaj 'Virion' Milewski pisze:
> W dniu wtorek, 17 maja 2016 11:03:13 UTC+2 użytkownik kons...@wp.pl napisał:
>
>> Dlaczego nie działa mój kod tak jak powinien?
>
> Bo nie stosujesz virtual-on-base - override-on-child, tylko overload-on-base - virtual-on-child, czyli coś totalnie z czapy. W efekcie, klasa bazowa nie jest polimorficzna.
>
> To naprawdę są podstawy. Gdy piszę: wykuć na blachę, nie mam na myśli - umieć znaleźć regułkę na 4programmers. Znaczenie tych keywordów przy tworzeniu polimorficznych hierarchii klas trzeba sobie trwale przyswoić, żeby się nie odbijać od takich kwiatków.
>

Nie dotarła moja odpowiedź i napisałeś ty.

Miała być taka
 > overload
 > virtual
 > override
 > reintroduce
 >

Chyba zrozumiałem twój nakaz i działa.


W rzeczywistości była wykonywany kod z klasy TDokument tylko że ja nie 
pokrywałem funkcji test i był wykonywany z klasy TBaseDoc(przodka) i 
tutaj był mój problem.
Czasami zdarza się pomroczność jasna.
Dzięki za podpowiedzi.

---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Problem z BPL
#344953
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 09:27
12 lines
2264 bytes
W dniu wtorek, 17 maja 2016 11:19:02 UTC+2 użytkownik kons...@wp.pl napisał:

> Czasami zdarza się pomroczność jasna.
> Dzięki za podpowiedzi.

You're welcome :-)

Jeszcze jeden hint: pomyśl nad użyciem interfejsów zamiast klas bazowych. BPLom nie sprawia to większej różnicy, ale soft zyskuje na czytelności. Następny krok: Dependency Injection / Inversion of Control. Nie wiem, do tam dokładnie robisz, ale przy pluginach wszelkiej maści DI to zdecydowanie dobry pomysł.

-- 
Pozdrawiam,
Virion
Re: Problem z BPL
#344954
Author: konsul41
Date: Tue, 17 May 2016 09:34
28 lines
2837 bytes
W dniu 17-05-2016 o 11:27, Mikołaj 'Virion' Milewski pisze:
> W dniu wtorek, 17 maja 2016 11:19:02 UTC+2 użytkownik kons...@wp.pl napisał:
>
>> Czasami zdarza się pomroczność jasna.
>> Dzięki za podpowiedzi.
>
> You're welcome :-)
>
> Jeszcze jeden hint: pomyśl nad użyciem interfejsów zamiast klas bazowych. BPLom nie sprawia to większej różnicy, ale soft zyskuje na czytelności. Następny krok: Dependency Injection / Inversion of Control. Nie wiem, do tam dokładnie robisz, ale przy pluginach wszelkiej maści DI to zdecydowanie dobry pomysł.
>
Mam wtyczki oparte na interfejsach według pomysłu Arivald-a, ale 
chciałem zobaczyć jak by się to sprawdzało na bpl-ach.

Niestety mam trochę za małą wiedzę aby zrobić przejście TDataSet za 
pomocą interfejsów.
Niby działa już pobieranie danych, parametry zapytań, i parę innych.
Muszę jeszcze dorobić applyupdates i odpowiednik UPDATESQL.
I to mnie jeszcze blokuje.
Używam ZEOS-ów a ich nie da się łatwo przekazywać exe-dll.
Z miłą chęcią udostępnił bym cały kod publicznie w zamian za pomoc w 
dokończeniu.
Nie potrzeba wiele tylko Applyupdates i UpdateSQL.

Głównie potrzebuję tylko Postgresql.

---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads