Thread View: pl.comp.lang.delphi
21 messages
21 total messages
Started by konsul41
Fri, 13 May 2016 20:58
Problem z BPL
Author: konsul41
Date: Fri, 13 May 2016 20:58
Date: Fri, 13 May 2016 20:58
65 lines
1959 bytes
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
Author: Mikołaj 'Virion' Milewski
Date: Fri, 13 May 2016 21:50
Date: Fri, 13 May 2016 21:50
9 lines
1603 bytes
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
Author: konsul41
Date: Mon, 16 May 2016 07:06
Date: Mon, 16 May 2016 07:06
70 lines
2551 bytes
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
Author: szemrany
Date: Mon, 16 May 2016 08:38
Date: Mon, 16 May 2016 08:38
18 lines
1799 bytes
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
Author: Mikołaj 'Virion' Milewski
Date: Mon, 16 May 2016 12:41
Date: Mon, 16 May 2016 12:41
5 lines
1422 bytes
1422 bytes
Virtual? -- Pozdrawiam, Virion
Re: Problem z BPL
Author: Mikołaj 'Virion' Milewski
Date: Mon, 16 May 2016 12:45
Date: Mon, 16 May 2016 12:45
12 lines
2033 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 06:29
Date: Tue, 17 May 2016 06:29
82 lines
2892 bytes
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
Author: wloochacz
Date: Tue, 17 May 2016 06:32
Date: Tue, 17 May 2016 06:32
25 lines
2311 bytes
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
Author: wloochacz
Date: Tue, 17 May 2016 06:34
Date: Tue, 17 May 2016 06:34
9 lines
1375 bytes
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
Author: wloochacz
Date: Tue, 17 May 2016 06:41
Date: Tue, 17 May 2016 06:41
26 lines
1959 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 07:41
Date: Tue, 17 May 2016 07:41
20 lines
1879 bytes
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
Author: Adam Siwoń
Date: Tue, 17 May 2016 08:36
Date: Tue, 17 May 2016 08:36
51 lines
2733 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 08:44
Date: Tue, 17 May 2016 08:44
232 lines
6763 bytes
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
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 08:52
Date: Tue, 17 May 2016 08:52
17 lines
1832 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 08:56
Date: Tue, 17 May 2016 08:56
65 lines
2454 bytes
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
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 09:02
Date: Tue, 17 May 2016 09:02
12 lines
1970 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 09:03
Date: Tue, 17 May 2016 09:03
43 lines
2890 bytes
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
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 09:10
Date: Tue, 17 May 2016 09:10
11 lines
2231 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 09:19
Date: Tue, 17 May 2016 09:19
31 lines
2598 bytes
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
Author: Mikołaj 'Virion' Milewski
Date: Tue, 17 May 2016 09:27
Date: Tue, 17 May 2016 09:27
12 lines
2264 bytes
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
Author: konsul41
Date: Tue, 17 May 2016 09:34
Date: Tue, 17 May 2016 09:34
28 lines
2837 bytes
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