🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
18 messages
18 total messages Started by konsul41 Mon, 19 Jun 2017 08:22
Rozwój złożonego projektu.
#345840
Author: konsul41
Date: Mon, 19 Jun 2017 08:22
63 lines
3818 bytes
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.

W chwili obecnej Księgowy mocno zaawansowany tak na 95% (nie 100 
ponieważ ciągle go rozwijam, pracuję jako księgowy dlatego to 
rozwinięte). Można wykorzystywać jego dokumenty za pomocą serwera 
automatyzacji. Program importuje dokumenty z programów Symfonia (SAGE) z 
plików, WFMAG (ASSECO) z bazy.
2 rodzaje pluginów BPL raczej do użytku przez program (dokumenty 
dostępne przez Serwer Automatyzacji) i Interfejsy dla szerokiego grona.
Menu programu głównego dostępne dla wtyczek.

Parę innych projektów CRM, płacowy i inne dodatki, płacowy trochę w 
PHP(mocno ograniczony), wyświetlanie czasu do czytania kart kierowców.

99% napisane w DELPHI moja licencja XE2 Pro. Staram się wykorzystywać 
tylko standardowe komponenty nie ma wiele wodotrysków wizualnych.
trochę PHP i WinAPI. Wszystko oparte na Postgresql <9.0.
Obecnie "system" zawiera około 300 plików pas, co nie jest wyznacznikiem.
Delphi pokazuje wierszy
Główny plugin obsługi dokumentów 17897 Mocno rozbudowana struktura 
drzewiasta dokumentów, pln i równocześnie waluta (pobierane z NBP Delphi 
lub PHP).
Plugin odpowiedzialny za plan kont 6280.
Serwer Automatyzacji (dokumenty)tylko 180.
Generowanie JPK_VAT 1245

Interfejsy
Import z WFMAG 10099
Import z Symfoni 1923

Gdzieś się kołacze import zapisów bankowych z systemu BPH (soap, 
zatwierdzone przez bank) niestety nie dogadałem się z moim 
bankiem(lokalnym) w sprawie certyfikatu końcowego i d... blada.

i parę innych
Oczywiście wielkość plików nic nie mówi o wielkości programu, ale trochę 
pokazuje z czym należy się liczyć.

Kierunki przewidywanego rozwoju to dopracowanie księgowego (nowe 
pomysły), CRM, ERP, obsługa transportu.
Ja pracuję w takich firmach i to mi jest potrzebne, ale w niczym nie 
przeszkadza aby ktoś obsługiwał inne branże niż transport,handel i 
produkcja.


Poszukuję osób z jako taką znajomością Delphi (BPL, Interfejsy, SQL) na 
podobnym do mnie rozwoju (średnio zaawansowany) raczej osób które 
pracują w podobnych firmach nie koniecznie księgowi. Mogą to być 
kierownicy produkcji, sekretariat, właściciele itp. Chodzi o ludzi 
którzy narzekają na brak odpowiedniego dostosowanego do nich 
oprogramowania, które ułatwi im pracę. Nie odrzucam dystrybutorów 
oprogramowania, ale coś za coś.


W zamian oferuję możliwość sprzedaży na własną rękę programu w takim 
systemie licencjonowania jakim sobie kto zechce. Oczywiście przy 
odpowiednim wkładzie pomysłów, poprawek, kodu... Odpowiedni wkład to 
pojęcie względne i każdy mniej więcej wie ile to jest. Zakładam próg 
około 0,5% kodu całości dla programisty co nie jest ostateczne.

Zależy mi na rozwoju systemu.
Re: Rozwój złożonego projektu.
#345841
Author: immo
Date: Mon, 19 Jun 2017 08:42
16 lines
2040 bytes
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

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

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.

pozdrawiam,
Przemek O.
Re: Rozwój złożonego projektu.
#345843
Author: 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.
Re: Rozwój złożonego projektu.
#345848
Author: konsul41
Date: Mon, 19 Jun 2017 09:15
2 lines
1127 bytes
tutaj prezentacja BankConnekt BPH
http://www.kssoft.cba.pl/prezentacje/bankconnect/prezentacja.htm
Re: Rozwój złożonego projektu.
#345847
Author: konsul41
Date: Mon, 19 Jun 2017 09:45
66 lines
2962 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


Dla mnie jeszcze ciekawe kawałki:

var
   DC, MemDC: HDC;
   MemBitmap, OldBitmap: HBITMAP;
   PS: TPaintStruct;
begin
   if not FDoubleBuffered or (Message.DC <> 0) then
   begin
     if not (csCustomPaint in ControlState) and (ControlCount = 0) then
       inherited
     else
       PaintHandler(Message);
   end
   else
   begin
     DC := GetDC(0);
     MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, 
ClientRect.Bottom);
     ReleaseDC(0, DC);
     MemDC := CreateCompatibleDC(0);
     OldBitmap := SelectObject(MemDC, MemBitmap);
     try
       DC := BeginPaint(Handle, PS);
       Perform(WM_ERASEBKGND, MemDC, MemDC);
       Message.DC := MemDC;
       WMPaint(Message);
       Message.DC := 0;
       BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 
0, SRCCOPY);
       EndPaint(Handle, PS);
     finally
       SelectObject(MemDC, OldBitmap);
       DeleteDC(MemDC);
       DeleteObject(MemBitmap);
     end;
   end;
end;
rysowanie nisko poziomowe
wykorzystywane do rysowania deklaracji.
Dzięki Arivald


     FFile := TMemoryStream.Create();
     FFile.LoadFromFile(FFileName);
     PFile := PAnsiChar(FFile.Memory);
     pend  := PAnsiChar(FFile.Memory) + FFile.Size-5;


Przeglądanie PDF-A jak PAnsiCHAR
i rozpakowywanie strumieni PDF-a w celu obróbki e-deklaracji w swoim 
systemie.
Jest więcej takich rzeczy.
Mnie to interesuje nie wiem jak ciebie.
Re: Rozwój złożonego projektu.
#345849
Author: konsul41
Date: Mon, 19 Jun 2017 09:51
218 lines
9812 bytes
Obsługa Drag and Drob z uwzględnieniem formatu Outlook

function TCRMkontrahent.Drop(const dataObj: IDataObject; grfKeyState: 
Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
Const
   RenPrivateSourceFolder=  49972;
   RenPrivateMessages    =  49587;
   RenPrivateItem        =  49812;
   TClipFormat_          =  49281;
   CFSTR_FILEDESCRIPTORW =  49280;
   FileNameW             =  49159;
   CFSTR_FILECONTENTS    =  49282;
   CSV                   =  49993;



   TTextFormat: array [1 .. 18] of String = ('CF_TEXT = 1','CF_BITMAP = 
2','CF_METAFILEPICT = 3','CF_SYLK = 4','CF_DIF = 5',
                                              'CF_TIFF = 6','CF_OEMTEXT 
= 7','CF_DIB = 8','CF_PALETTE = 9','CF_PENDATA = 10',
                                              'CF_RIFF = 11','CF_WAVE = 
12','CF_UNICODETEXT = 13','CF_ENHMETAFILE = 14','CF_HDROP = 15',
                                              'NONE = $16','NONE = 
$17','CF_MAX = 18');

   TClipFormat: array [0 .. 10] of Integer = (0,//:  cfFormat: 
TClipFormat = "RenPrivateSourceFolder" (49972)  tymed: Longint = 4 
(TYMED_ISTREAM)
                                              1,//:  cfFormat: 
TClipFormat = "RenPrivateMessages" (49587) tymed: Longint = 4 
(TYMED_ISTREAM)
                                              2,//:  cfFormat: 
TClipFormat = "RenPrivateItem" (49812)  tymed: Longint = 1  (TYMED_HGLOBAL)
                                              3,//:  cfFormat: 
TClipFormat = CFSTR_FILEDESCRIPTOR ("FileGroupDescriptor", 49281) tymed: 
Longint = 1  (TYMED_HGLOBAL)
                                              4,//:  cfFormat: 
TClipFormat = CFSTR_FILEDESCRIPTORW ("FileGroupDescriptorW", 49280) 
tymed: Longint = 1  (TYMED_HGLOBAL)
                                              5,//:  cfFormat: 
TClipFormat = "FileNameW" (49159)   tymed: Longint = 2  (TYMED_FILE)
                                              6,//:  cfFormat: 
TClipFormat = CFSTR_FILECONTENTS ("FileContents", 49282) tymed: Longint 
= 12  (TYMED_ISTREAM, TYMED_ISTORAGE)
                                              7,//:  cfFormat: 
TClipFormat = "Object Descriptor" (49166)  tymed: Longint = 1 
(TYMED_HGLOBAL)
                                              8,//:  cfFormat: 
TClipFormat = CF_TEXT (1) tymed: Longint = 1  (TYMED_HGLOBAL)
                                              9,//:  cfFormat: 
TClipFormat = CF_UNICODETEXT (13)  tymed: Longint = 1  (TYMED_HGLOBAL)
                                              10//:  cfFormat: 
TClipFormat = "CSV" (49993)   tymed: Longint = 1  (TYMED_HGLOBAL)
                                               );
var
   enum : IEnumFORMATETC;
   Medium:TSTGMedium;
   Forma : TForm;
   RadioGroup : TRadioGroup;
   Memo : TMemo;
   hres:HRESULT;
   OLEFormat: TFormatEtc;
   Fetched: Integer;
   text : String;
   lista : TObjectList;
   OBContener : ^TOBContener;
   var fmtname: array[0..128] of Char;
   punkt : TPoint;

begin
   punkt:=pt;
   if Windows.ScreenToClient(Button1.Handle,punkt)then
   begin
     if (punkt.x>0) and (punkt.Y>0) then
     begin
       if (punkt.Y<Button1.ClientHeight) AND
          (punkt.x<Button1.ClientWidth)  then
       begin
         Button1Click(Self);
       end;
     end;
   end;
   CF_OEOutlook_Express_Messages := RegisterClipboardFormat('Outlook 
Express Messages');
   CF_OEtext_x_moz_messageyt := 
RegisterClipboardFormat('text/x-moz-message');
   CF_OEtext_x_moz_url := RegisterClipboardFormat('text/x-moz-url');
   CF_OEFileGroupDescriptor := 
RegisterClipboardFormat('FileGroupDescriptor');
   CF_OEFileGroupDescriptorW := 
RegisterClipboardFormat('FileGroupDescriptorW');
   CF_OEFileContents := RegisterClipboardFormat('FileContents');
   CF_OEUniformResourceLocator := 
RegisterClipboardFormat('UniformResourceLocator');
   CF_OEUniformResourceLocatorW := 
RegisterClipboardFormat('UniformResourceLocatorW');
   CF_OEapplication_x_moz_file_promise_url := 
RegisterClipboardFormat('application/x-moz-file-promise-url');
   CF_OEPreferred_DropEffect := RegisterClipboardFormat('Preferred 
DropEffect');
   CF_OEDragImageBits := RegisterClipboardFormat('DragImageBits');
   CF_OEDragContext := RegisterClipboardFormat('DragContext');
   CF_HTML__HyperText_Markup_Language_ := 
RegisterClipboardFormat('HyperText Markup Language');
   CF_HTML_Format := RegisterClipboardFormat('HTML Format');
   CF_Link := RegisterClipboardFormat('Link');
   CF_Rich_Text_Format := RegisterClipboardFormat('Rich Text Format');
   CF_UntrustedDragDrop := RegisterClipboardFormat('UntrustedDragDrop');
   CF_msSourceUrl := RegisterClipboardFormat('msSourceUrl');


   Memo1.Lines.Clear;
   dataObj._AddRef;//mowimy, ze uzywamy tej instancji aby nie zostala 
skasowana
   hres := dataObj.EnumFormatEtc(DATADIR_GET, enum);
   if Failed(hres) then Memo1.lines.add('Error Message');
   //Sporządzenie listy możliwych do imporu formatu danych
   //i pozostawienie decyzji w jakim kształcie mają pozostać dane
    Forma:=TForm.Create(Self);
    Forma.AutoSize:=true;
    RadioGroup:=TRadioGroup.Create(Forma);
    RadioGroup.Parent:=Forma;
    RadioGroup.Width:=500;
    RadioGroup.Caption:='Formaty danych';
    RadioGroup.WordWrap:=true;
    RadioGroup.Align:=alLeft;

    Memo:=TMemo.Create(Forma);
    Memo.Parent:=Forma;
    Memo.Left:=RadioGroup.Width;
    Memo.Width:=300;
    Memo.ScrollBars:=ssVertical;
    Memo.Align:=alClient;
    Memo.Clear;
    lista:=TObjectList.Create;
    try
      while enum.Next(1, OLEFormat, @Fetched) = S_OK do
      begin
        if OLEFormat.cfFormat=CF_TEXT then
        begin
          RadioGroup.Items.Add('CF_TEXT : Text kodowanie 
ANSI');new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_BITMAP  then
        begin RadioGroup.Items.Add('CF_BITMAP : Bitmapa'); 
new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_UNICODETEXT   then
        begin RadioGroup.Items.Add('CF_UNICODETEXT : texst kodowanie 
UNICODE'); new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_HDROP   then
        begin RadioGroup.Items.Add('CF_HDROP : Fizyczne pliki na 
dysku'); new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_HTML_Format  then
        begin RadioGroup.Items.Add('CF_HTML_Format : Strona www'); 
new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_Link   then
        begin RadioGroup.Items.Add('CF_Link : URL'); 
new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_Rich_Text_Format  then
        begin RadioGroup.Items.Add('CF_Rich_Text_Format : Format rtf'); 
new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else if OLEFormat.cfFormat=CF_msSourceUrl  then
        begin RadioGroup.Items.Add('CF_msSourceUrl : URL'); 
new(OBContener);OBContener^:=TOBContener.Create; 
OBContener^.OLEFormat:=OLEFormat;lista.Add(OBContener^);
        end else
        begin
          if 0 = GetClipboardFormatName(OLEFormat.cfFormat, fmtname, 
SizeOf(fmtname)) then
            fmtname[0] := #0;
          Memo.Lines.Add(fmtname+' format nie obsługiwany');
        end;
      end;

      try
        if RadioGroup.Items.Count>1 then
        begin
          Forma.ShowModal;
 
hres:=dataObj.GetData(TOBContener(lista[RadioGroup.ItemIndex]).OLEFormat,Medium 
);
 
ImportujDane(TOBContener(lista[RadioGroup.ItemIndex]).OLEFormat,Medium);
        end else
        begin
          RadioGroup.ItemIndex:=0;
 
hres:=dataObj.GetData(TOBContener(lista[RadioGroup.ItemIndex]).OLEFormat,Medium 
);
 
ImportujDane(TOBContener(lista[RadioGroup.ItemIndex]).OLEFormat,Medium);
        end;
      finally
        GlobalUnlock(Medium.hGlobal);//Medium.hGlobal);
        try
          ReleaseStgMedium(Medium);
        except
          ON E:Exception Do;
        end;
      end;
    finally
      lista.Free;
      RadioGroup.Free;
      Forma.Free;
    end;
   dataObj._Release;//teraz niech sie dzieje co sie chce ....
   dwEffect:=DROPEFFECT_COPY;
   Result:=S_OK;

end;

można to oczywiście poprawić, zmienić.
Re: Rozwój złożonego projektu.
#345850
Author: konsul41
Date: Mon, 19 Jun 2017 09:59
2 lines
1101 bytes
Dodatkowo implementacja w Delhi podpisu cyfrowego (e-deklaracja i JPK) 
to plany.
Re: Rozwój złożonego projektu.
#345856
Author: wloochacz
Date: Mon, 19 Jun 2017 11:51
23 lines
2211 bytes
W dniu 2017-06-19 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
> 
> 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
> 
> 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.
> 
> pozdrawiam,
> Przemek O.
> 
> 


-- 
wloochacz
Re: Rozwój złożonego projektu.
#345857
Author: konsul41
Date: Mon, 19 Jun 2017 12:20
1 lines
1220 bytes
?
Re: Rozwój złożonego projektu.
#345844
Author: immo
Date: Mon, 19 Jun 2017 13:04
29 lines
3893 bytes
W dniu poniedziałek, 19 czerwca 2017 11:13:16 UTC+2 użytkownik kons...@wp.pl napisał:

> A co jest ciekawe według ciebie? Moim zdaniem dla średnio-zaawansowanego 

hmm... Sterowanie rakietą kosmiczną? :P Nie o to chodzi. Bardziej miałem to na myśli, że programów księgowych/CRM jest od groma i ciekawego w nich już nie ma nic. Oczywiście, tak jak napisałeś, ciekawa może być użyta technologia i/lub rozwiązania, ale to już całkiem inna sprawa.

> http://www.kssoft.cba.pl/forum/viewtopic.php?f=8&t=9

Pobieżnie obejrzałem to co jest na stronie + prezentacja pobierania z banku. W pierwszym poście pisałeś: "W zamian oferuję możliwość sprzedaży na własną rękę programu w takim systemie licencjonowania jakim sobie kto zechce". Nie obraź się, ale program w takim stanie wymaga dużego nakładu pracy, żeby przystosować go do sprzedaży dla klienta końcowego.

> Obecnie główny program w zasadzie ładuje tylko pluginy i to one trzymają 
> grafiki itp.

Rzuciłem także okiem na kod - pomysły fajne, niektóre rozwiązania ciekawe, ale kod taki sobie. Piszesz że masz XE2 a nie wykorzystujesz tego co masz :) 
Polecam książkę Nicka Hodges'a "Programowanie w języku Delphi". Jeśli nie czytałeś to po przeczytaniu tej pozycji zmieni się częściowo Twoje podejście do programowania.

Nie mniej mi za złe że piszę co myślę, bo po pierwszym poście zastanawiałem się nad tym. Sam nie mam programu księgowego i często się zastanawiałem nad zrobieniem modułu księgowego z prawdziwego zdarzenia do mojego oprogramowania. Jednak po tym co pokazałeś stwierdzam że to jednak nie dla mnie. Za duże różnice w kodzie (samym sposobie pisania), za dużo pracy nad GUI. 
 
> 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.

Tylko że w tym momencie piszesz program pod siebie. Ciężko będzie to sprzedać. Ciężko będzie znaleźć osobę która będzie miała takie same wymagania. Niemniej - powodzenia - może ktoś się znajdzie. Faktycznie taki program rozwijać samemu to trochę dużo roboty.

pozdrawiam,
Przemek O.
Re: Rozwój złożonego projektu.
#345845
Author: Karol
Date: Mon, 19 Jun 2017 16:45
68 lines
4404 bytes
W dniu 2017-06-19 o 15:04, immo pisze:
> W dniu poniedziałek, 19 czerwca 2017 11:13:16 UTC+2 użytkownik kons...@wp.pl napisał:
>
>> A co jest ciekawe według ciebie? Moim zdaniem dla średnio-zaawansowanego
>
> hmm... Sterowanie rakietą kosmiczną? :P Nie o to chodzi. Bardziej miałem to na myśli, że programów księgowych/CRM jest od groma i ciekawego w nich już nie ma nic.
> Oczywiście, tak jak napisałeś, ciekawa może być użyta technologia i/lub rozwiązania, ale to już całkiem inna sprawa.

Można wiele jeszcze zrobić chociażby WorkFlow (przepływ pracy), praca 
grupowa itd
>
> Nie obraź się, ale program w takim stanie wymaga dużego nakładu pracy, żeby przystosować go do sprzedaży dla klienta końcowego.
>
Znam jego ograniczenia i się nie obrażam

>> Obecnie główny program w zasadzie ładuje tylko pluginy i to one trzymają
>> grafiki itp.
>
> Rzuciłem także okiem na kod - pomysły fajne, niektóre rozwiązania ciekawe, ale kod taki sobie.
Dzięki Ja nie jestem zawodowcem. Zaprezentowany kod jest sprzed 6-10 lat 
od tamtej pory sporo się zmieniło. Ostatnio Zadobyłem "Oprogramowanie 
łatwe w utrzymaniu" Joost Visser jedno z zaleceń tam poruszane to metoda 
długości 15 linijek nawet dla SQL, Jeżeli są dłuższe do należy 
przemyśleć koncepcję programu. Nie więcej niż 2-3 argumentów dla 
funkcji/procedur. Co prawda książka pisana z myślą o Javie ale aktualna 
jest również dla innych.

95% kodu jest nie widoczna i trudno mi nie opisując dokładnie całej 
architektury i udostępniania dużej ilości kodu pokazać coś więcej.

> Piszesz że masz XE2 a nie wykorzystujesz tego co masz :) Polecam książkę Nicka Hodges'a "Programowanie w języku Delphi".
> Jeśli nie czytałeś to po przeczytaniu tej pozycji zmieni się częściowo Twoje podejście do programowania.
Mam dlatego np używam typów Generycznych
property listaDoc : TDictionary<String,String> read FlistaDoc;
reprezentuje listę stringów nazw dokumentów i nazw klas zarejestrowanych 
dokumentów, potem
function TMainConfiguration.GetListaObslugiwanychDok: WideString;
var i : Integer;
     item: TPair<String,String>;
begin
   if assigned(main)  then
   begin
     for item in main.listaDoc do
     begin
       result:=result+item.Key+'#';
     end;
   end else result:='';
end;
i mamy listę obsługiwanych dokumentów w jakimkolwiek pluginie.

Pluginy "Interfejsy" "przechowywane" są w fabryce, to też dzięki 
Arivald-owi.
I sporo innych.


>
> Nie mniej mi za złe że piszę co myślę, bo po pierwszym poście zastanawiałem się nad tym.
>  Sam nie mam programu księgowego i często się zastanawiałem nad zrobieniem modułu księgowego z prawdziwego zdarzenia do mojego oprogramowania.
>  Jednak po tym co pokazałeś stwierdzam że to jednak nie dla mnie. Za duże różnice w kodzie (samym sposobie pisania), za dużo pracy nad GUI.
>
Nie mam Ci za złe i oczekuję jakiegoś przykładu.

> Tylko że w tym momencie piszesz program pod siebie.
I dlatego chcę rozszerzyć grono jego twórców.


> Ciężko będzie znaleźć osobę która będzie miała takie same wymagania.
Staram się tego unikać, ale samemu jest ciężko.
Re: Rozwój złożonego projektu.
#345846
Author: konsul41
Date: Tue, 20 Jun 2017 06:39
16 lines
1986 bytes
W dniu 19-06-2017 o 15:04, immo pisze:
> W dniu poniedziałek, 19 czerwca 2017 11:13:16 UTC+2 użytkownik kons...@wp.pl napisał:
> 
>> A co jest ciekawe według ciebie? Moim zdaniem dla średnio-zaawansowanego
> 
> hmm... Sterowanie rakietą kosmiczną? :P Nie o to chodzi. Bardziej miałem to na myśli, że programów księgowych/CRM jest od groma i ciekawego w nich już nie ma nic. 

A ile widziałeś takich(poza drogimi, naprawdę drogimi) z automatycznym 
księgowaniem co miesiąc np: księgowanie 1/12 kosztu polisy co miesiąc?
W tych do kilku tysięcy nie widziałem żadnego.
To jeden z moich pomysłów, a bardzo by mi się przydał w swojej pracy co 
miesiąc miałbym kilka takich przypadków.

Ktoś kiedyś podrzucił na tej grupie przykład oprogramowania elektrowni, 
w którym można zrobić snapshot okien przechodzisz do innych okien, bo 
musisz coś sprawdzić, a potem odtwarzasz zestaw okien.
Re: Rozwój złożonego projektu.
#345842
Author: konsul41
Date: Tue, 20 Jun 2017 06:53
7 lines
1398 bytes
Ewentualnie Ja zawsze stosuję 2 kursy walut na fakturze jeden do celów 
podatku dochodowego, a drugi do celów VAT przydatne zwłaszcza w umowach 
nie typowych i dostawach wewnątrzwspólnotowych.

Więcej nie męczę.
Jeżeli ktoś będzie zainteresowany zapraszam do kontaktu poza grupą aby 
nie tworzyć offtop.
Re: Rozwój złożonego projektu.
#345851
Author: krolikbest
Date: Tue, 20 Jun 2017 20:16
14 lines
1436 bytes
>
>     FFile := TMemoryStream.Create();
>     FFile.LoadFromFile(FFileName);
>     PFile := PAnsiChar(FFile.Memory);
>     pend  := PAnsiChar(FFile.Memory) + FFile.Size-5;
>

To mnie zaciekawiło. Nigdy nie musiałem zajmować się rozbiórka pdfów. 
Przybliżysz temat? Nie chodzi też oczywiście o zewn. biblioteki do 
rozbiórki tych dokumentów.

Pozdr
krolikbest
Re: Rozwój złożonego projektu.
#345852
Author: Roman Tyczka
Date: Tue, 20 Jun 2017 20:38
13 lines
1414 bytes
On Tue, 20 Jun 2017 22:16:43 +0200, krolikbest wrote:

> To mnie zaciekawiło. Nigdy nie musiałem zajmować się rozbiórka pdfów. 
> Przybliżysz temat? Nie chodzi też oczywiście o zewn. biblioteki do 
> rozbiórki tych dokumentów.

PDF to tak naprawdę PostScript z możliwością osadzania fontów i innych
danych binarrnych oraz ich kompresji, czyli w dużej mierze plik tekstowy,
który daje się parsować i analizować.

-- 
pozdrawiam
Roman Tyczka
Re: Rozwój złożonego projektu.
#345853
Author: konsul41
Date: Wed, 21 Jun 2017 06:18
84 lines
3411 bytes
W dniu 20-06-2017 o 22:16, krolikbest pisze:
> 
>>
>>     FFile := TMemoryStream.Create();
>>     FFile.LoadFromFile(FFileName);
>>     PFile := PAnsiChar(FFile.Memory);
>>     pend  := PAnsiChar(FFile.Memory) + FFile.Size-5;
>>
> 
> To mnie zaciekawiło. Nigdy nie musiałem zajmować się rozbiórka pdfów. 
> Przybliżysz temat? Nie chodzi też oczywiście o zewn. biblioteki do 
> rozbiórki tych dokumentów.
> 
> Pozdr
> krolikbest
> 
To jest kolejny projekt/pomysł na obróbkę e-deklaracji.
Pdfy można zapisywać z XML i chcę podłożyć XML w PDF i wyświetlić go w 
Acrobat Reader i za jego pomocą wysłać. Ma być to przezroczyste dla 
użytkownika.

Cały pdf to drzewo "obj" w każdym obj mogą być odwołania do kolejnych obj.

drzewo wygląda mniej więcej tak:
roo--- pages --- page
              --- page
    --- fonts
    --- fonts
    --- XForms
    --- files
to tylko przykład

Ogólnie kod nie jest mój, Ja go tylko dostosowuje do swoich potrzeb
i jestem na etapie rozszyfrowywania objstream.
Nie pamiętam gdzie ale znalazłem w necie kod kogoś kto zrobił większość 
roboty. Większość kodu polega na przeglądaniu znaków i traktowanie 
całego PDF jako PAnsiChar.





function TPDFClass.FindStrInDict(const str: ansistring): boolean;
  var
     nestLvl: integer;
     str1: AnsiChar;
   begin
     //nb: PDF 'dictionaries' start with '<<' and terminate with '>>'
     result := false;
     nestLvl := 0;
     str1 := str[1];
     while not result do
     begin
       while not (p^ in ['>','<',str1]) do inc(p);
       if (p^ = '<') then
       begin
         if (p+1)^ = '<' then begin inc(nestLvl); inc(p); end;
       end
       else if (p^ = '>') then
       begin
         if (p+1)^ = '>' then
         begin
           dec(nestLvl);
           inc(p);
           if nestLvl <= 0 then exit;  //Continue;//
         end
       end else
       begin
         result := (nestLvl < 2) and IsString(str);
         if result then exit;
       end;
       inc(p);
     end;
end;

użyte tak
  if not FindStrInDict('/Filter') then exit;
przesuwa wskaźnik za szukany ciąg.



Mogę na priv podesłać cały spakowany projekt który rozbiera e-deklaracje 
na obiekty i sobie możesz popatrzeć jak to jest zbudowane.
Ostrzegam kod to swobodna twórczość.
Re: Rozwój złożonego projektu.
#345854
Author: konsul41
Date: Wed, 21 Jun 2017 06:20
6 lines
1241 bytes
> roo--- pages --- page
  root--- pages --- page


kod jest chyba z tąd http://www.angusj.com/delphitips/pdfpagecount.php
Re: Rozwój złożonego projektu.
#345855
Author: krolikbest
Date: Wed, 21 Jun 2017 17:46
12 lines
1423 bytes
W dniu 2017-06-21 o 08:20, konsul41@wp.pl pisze:
>
>> roo--- pages --- page
>  root--- pages --- page
>
>
> kod jest chyba z tąd http://www.angusj.com/delphitips/pdfpagecount.php
dziękuję za info, bardzo przypadne.

Pozdr

krolikbest
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