Article View: pl.comp.lang.delphi
Article #345843Re: Rozwój złożonego projektu.
From: konsul41
Date: Mon, 19 Jun 2017 09:13
Date: Mon, 19 Jun 2017 09:13
241 lines
10219 bytes
10219 bytes
W dniu 19-06-2017 o 10:42, immo pisze:
> W dniu poniedziałek, 19 czerwca 2017 10:22:24 UTC+2 użytkownik kons...@wp.pl napisał:
>> Prowadzę na własne potrzeby pewien projekt do obsługi firm (głównie
>> księgowej) i chcę go rozszerzyć.
>> Coraz mniej czasu a projekt jednak ciekawy.
> amisty co nie jest ostateczne.
>>
>> Zależy mi na rozwoju systemu.
>
> To czy ciekawy to zależy :) Osobiście nie widzę niczego ciekawego w pisaniu aplikacji księgowej/CRM/Magazynu itd itp. :P
A co jest ciekawe według ciebie? Moim zdaniem dla średnio-zaawansowanego
użycie w jednym zastosowaniu wtyczek BPL i interfejsów oraz serwera
automatyzacji które pracują łącznie w jednej hierarchii klas (wiem nie
zawsze dziedziczenie jest lepsze od kompozycji) jest ciekawe.
>
> Daj gdzieś screenshoty GUI, wstaw gdzieś kawałki przykładowego kodu. Ilość linii kodu jest najmniej potrzebna do ewentualnej oceny czy dołączyć do projektu czy nie:P
http://www.kssoft.cba.pl/forum/viewtopic.php?f=8&t=9
Obecnie główny program w zasadzie ładuje tylko pluginy i to one trzymają
grafiki itp.
pomijam że dla programisty wygląd programu o niczym nie świadczy.
Wszystkie przyciski tworzone są dynamicznie.
ładowanie BPLI
var
hBibl: Integer;
Found: Integer;
SR: TSearchRec;
var Reg : TRegistry;
wtyczka : IObjectFactoryDriver;
begin
//wczytywnie wtyczek
Found := FindFirst(ExtractFilePath(Application.ExeName) +
'\plugin\*.bpl', faAnyFile, SR);
// szukaj
while (Found = 0) do
// dopoki liczba znalezionych plikow nie bedzie rowna 0
begin
// Ładuję wtyczkę do pamięci
hBibl := LoadPackage(PChar(ExtractFilePath(Application.ExeName) +
'\plugin\' + SR.Name));
if hBibl = 0 then
begin
RaiseLastOSError;
Abort;
end;
if SR.Name='doksys.bpl' then
begin
//przemyśleć
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if not REG.KeyExists('\Software\KSCORP\KsiegiKS') then
REG.CreateKey('\Software\KSCORP\KsiegiKS');
if Reg.OpenKey('\Software\KSCORP\KsiegiKS', True) then
begin
REG.WriteString('doksyslocation',
ExtractFilePath(Application.ExeName) + '\plugin\');
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
// hBibl = 0 ;
SetLength(BPLeMAIN, Length(BPLeMAIN) + 1);
// Zwiększamy ilość DLL'ków
BPLeMAIN[Length(BPLeMAIN) - 1] := hBibl;
@fGenerujInterfejsWtyczki :=
GetProcAddress(BPLeMAIN[Length(BPLeMAIN)-1], 'GenerujInterfejsWtyczki');
if assigned(fGenerujInterfejsWtyczki) then
begin
wtyczka:=nil;
//rejestracja drivers z dll
fGenerujInterfejsWtyczki(wtyczka,ObjectFactory);
end;
// Przypisz załadowaną bibliotekę
Found := FindNext(SR);
end;
FindClose(SR);
end;
Otwieranie dokumentu z listy dokumentów
var
i : Integer;
Zakladka: TBookmark;
ZQuery: TZQuery;
AClass: TPersistentClass;
FormName : String;
begin
if not (Sender is TDBGrid) then Exit;
if TDBGrid(Sender).DataSource.DataSet.Active then
if TDBGrid(Sender).DataSource.DataSet.RecordCount = 0 then
Exit;
ZQuery := TZQuery.Create(Self);
ZQuery.Connection := FConnection;
try
try
ZQuery.SQL.Text :='select pg_try_advisory_lock(:dok_id),* from
ksiegi_dokumenty_nag where dok_id=:dok_id;';
ZQuery.ParamByName('dok_id').AsInteger :=
FQDziennik.FieldByName('dok_id').AsInteger;
ZQuery.Open;
FormName:=FlistaDoc.Items[FQDziennik.FieldByName('typdok').Text];
AClass := GetClass(FormName);
if AClass <> nil then
begin
with
TBaseDokument(TBaseDoc(AClass)).Create(Self,FConnection,FDaneProgram,ttedycja,FQDziennik.FieldByName('dok_id').AsInteger,Fdziennik,FDaneProgram.RokKsiegowy)
do
begin
Active:=true;
ShowModal;
Active:=False;
Free;
end;
end else raise Exception.Create(FormName+' Brak obsługi tego
dokumentu.');
Zakladka := TDBGrid(Sender).DataSource.DataSet.GetBookmark; //
ustawienie zakładki
TDBGrid(Sender).DataSource.DataSet.Refresh;
TDBGrid(Sender).DataSource.DataSet.GotoBookmark(Zakladka); //
przejście do zakł.
TDBGrid(Sender).DataSource.DataSet.FreeBookmark(Zakladka); //
zwolnienie zakładki
except
on E: ENieObslTypDok do ShowMessage(E.Message);// 'Nie
obsługiwany typ dokumentu.');
end;
finally
ZQuery.Close;
ZQuery.SQL.Text := 'select pg_advisory_unlock(:dok_id),* from
ksiegi_dokumenty_nag where dok_id=:dok_id;';
ZQuery.ParamByName('dok_id').AsInteger :=
FQDziennik.FieldByName('dok_id').AsInteger;
ZQuery.ExecSql;
ZQuery.Free;
end;
end;
//klasa bazowa wszystkich dokumentów
TBaseDokument = class of TBaseDoc;
TBaseDoc = class(TComponent,IBaseDoc)
private
FRefCount : Integer;
protected
procedure SetActive(value : Boolean);virtual;
function GetActive() : Boolean;virtual;
//funkcja słuzy do aktualizacji bazy danych i innych operacji
przygotowujących program do pracy
function UpdateConfiguration(konfiguracja :
TConfiguration):WideString;Virtual;
public
procedure SetDaneProgram(value : TDaneProgram);virtual;
function GetDaneProgram() : TDaneProgram;virtual;
procedure SetPokazujKomunikaty(value : Boolean);virtual;
procedure GetPNG(out png : TPngImage);virtual;
function GetKategoria():WideString;virtual;
function GetButtonText():WideString;virtual;
function GetListaObslugiwanychDok(body : Boolean): WideString; virtual;
//function GetBitmap():TBitmap;virtual;
procedure SetConnection(value : TZConnection);virtual;
procedure Setdok_id(value : Integer);virtual;
procedure Setrokdok(value : Integer);virtual;
procedure SetNazwaDziennika(value : WideString);virtual;
procedure SetNumerDziennika(value : Integer);virtual;
procedure SetTrybDokumentu(value : TTrybDokumentu);virtual;
procedure SetCialoPozycjaStartowa(value : Integer);virtual;
function Getdok_id() : Integer;virtual;
function Getrokdok() : Integer;virtual;
function GetNazwaDziennika() : WideString;virtual;
function GetNumerDziennika() : Integer;virtual;
function GetTrybDokumentu() : TTrybDokumentu;virtual;
function GetQuery() : TZQuery;virtual;
function GetCialoPozycjaStartowa() : Integer;virtual;
procedure ShowModal;virtual;
procedure Show;virtual;
procedure ZatwierdzClick(Sender: TObject); virtual;
function ZaluzKonto(numerkonta, NazwaKonta, TypKonta: String):
Integer;virtual;
property Connection : TZConnection write SetConnection;
property dok_id : Integer read Getdok_id write Setdok_id;
property rokdok : Integer read Getrokdok write Setrokdok;
property NazwaDziennika :WideString read GetNazwaDziennika write
SetNazwaDziennika;
property NumerDziennika : Integer read GetNumerDziennika write
SetNumerDziennika;
property TrybDokumentu : TTrybDokumentu read GetTrybDokumentu write
SetTrybDokumentu;
property CialoPozycjaStartowa : Integer read
GetCialoPozycjaStartowa write SetCialoPozycjaStartowa;
property Active : Boolean read GetActive write SetActive;
property DaneProgram : TDaneProgram read GetDaneProgram write
SetDaneProgram;
property PokazujKomunikaty : boolean write SetPokazujKomunikaty;
constructor Create(AOwner: TComponent;Connection :
TZConnection;DaneProgram : TDaneProgram;TrybDokumentu : TTrybDokumentu;
dok_id:Integer;NazwaDziennika : String='';rokdok:Integer=0); virtual;
destructor Destroy; override;
//property obraz : TBitmap read GetBitmap;
//do obsługi interfejsów
function SetNaglowekFieldInText(FieldName, value: WideString):
Integer;virtual;
function SetCialoFieldInText(FieldName : WideString; value :
WideString):Integer;virtual;
function SetSpecialCialoFieldInText(FieldName : WideString; value :
WideString):Integer;virtual;
function WybierzKontrahenta(dane : TWideDaneFirmy): WideString;virtual;
procedure AddCialoRecord;virtual;
procedure Zatwierdz();virtual;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
>
> Każdy ma jakiś swój styl pisania i nie koniecznie "ciekawość" projektu musi być tym co może odstraszyć/przekonać do ewentualnego połączenia sił nad danym projektem.
Zgadzam się. dlatego szukam ludzi którzy pracują na podobnych do mojego
stanowiskach i wiedzą czego im brak lub co im przeszkadza w innych.
Mi np: w WFFakir przeszkadza 2 krotne wprowadzanie kwoty netto na
fakturę (dokument i rejestr VAT), Symfonia ma idiotyczne rozliczanie za
dokument(wpierw trzeba rozliczać korekty potem zwykłe inaczej nie
rozliczysz korekt) i to jest początek mojego programu.
Technical Details
Message-ID:
<oi84jc$imr$1@portraits.wsisiz.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!.POSTED.jue163.internetdsl.tpnet.pl!not-for-mailReferences:
<oi81jv$gcf$1@portraits.wsisiz.edu.pl> <3121b1d5-eadc-4911-a6c6-f1b76b9b088d@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!.POSTED.jue163.internetdsl.tpnet.pl!not-for-mail From: "konsul41@wp.pl" <konsul41@wp.pl> Newsgroups: pl.comp.lang.delphi Subject: Re: Rozwój złożonego projektu. Date: Mon, 19 Jun 2017 11:13:15 +0200 Organization: http://www.wit.edu.pl Message-ID: <oi84jc$imr$1@portraits.wsisiz.edu.pl> References: <oi81jv$gcf$1@portraits.wsisiz.edu.pl> <3121b1d5-eadc-4911-a6c6-f1b76b9b088d@googlegroups.com> Mime-Version: 1.0 Injection-Date: Mon, 19 Jun 2017 09:13:16 -0000 (UTC) Injection-Info: portraits.wsisiz.edu.pl; posting-host="jue163.internetdsl.tpnet.pl:95.48.160.163"; logging-data="19163"; mail-complaints-to="abuse@wsisiz.edu.pl" User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 In-Reply-To: <3121b1d5-eadc-4911-a6c6-f1b76b9b088d@googlegroups.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit