🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #345843

Re: Rozwój złożonego projektu.

#345843
From: konsul41
Date: Mon, 19 Jun 2017 09:13
241 lines
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-mail
References: <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