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.
Author: konsul41
Date: Mon, 19 Jun 2017 08:22
Date: Mon, 19 Jun 2017 08:22
63 lines
3818 bytes
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.
Author: immo
Date: Mon, 19 Jun 2017 08:42
Date: Mon, 19 Jun 2017 08:42
16 lines
2040 bytes
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.
Author: 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.
Re: Rozwój złożonego projektu.
Author: konsul41
Date: Mon, 19 Jun 2017 09:15
Date: Mon, 19 Jun 2017 09:15
2 lines
1127 bytes
1127 bytes
tutaj prezentacja BankConnekt BPH http://www.kssoft.cba.pl/prezentacje/bankconnect/prezentacja.htm
Re: Rozwój złożonego projektu.
Author: konsul41
Date: Mon, 19 Jun 2017 09:45
Date: Mon, 19 Jun 2017 09:45
66 lines
2962 bytes
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.
Author: konsul41
Date: Mon, 19 Jun 2017 09:51
Date: Mon, 19 Jun 2017 09:51
218 lines
9812 bytes
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.
Author: konsul41
Date: Mon, 19 Jun 2017 09:59
Date: Mon, 19 Jun 2017 09:59
2 lines
1101 bytes
1101 bytes
Dodatkowo implementacja w Delhi podpisu cyfrowego (e-deklaracja i JPK) to plany.
Re: Rozwój złożonego projektu.
Author: wloochacz
Date: Mon, 19 Jun 2017 11:51
Date: Mon, 19 Jun 2017 11:51
23 lines
2211 bytes
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.
Author: konsul41
Date: Mon, 19 Jun 2017 12:20
Date: Mon, 19 Jun 2017 12:20
1 lines
1220 bytes
1220 bytes
?
Re: Rozwój złożonego projektu.
Author: immo
Date: Mon, 19 Jun 2017 13:04
Date: Mon, 19 Jun 2017 13:04
29 lines
3893 bytes
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.
Author: Karol
Date: Mon, 19 Jun 2017 16:45
Date: Mon, 19 Jun 2017 16:45
68 lines
4404 bytes
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.
Author: konsul41
Date: Tue, 20 Jun 2017 06:39
Date: Tue, 20 Jun 2017 06:39
16 lines
1986 bytes
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.
Author: konsul41
Date: Tue, 20 Jun 2017 06:53
Date: Tue, 20 Jun 2017 06:53
7 lines
1398 bytes
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.
Author: krolikbest
Date: Tue, 20 Jun 2017 20:16
Date: Tue, 20 Jun 2017 20:16
14 lines
1436 bytes
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.
Author: Roman Tyczka
Date: Tue, 20 Jun 2017 20:38
Date: Tue, 20 Jun 2017 20:38
13 lines
1414 bytes
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.
Author: konsul41
Date: Wed, 21 Jun 2017 06:18
Date: Wed, 21 Jun 2017 06:18
84 lines
3411 bytes
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.
Author: konsul41
Date: Wed, 21 Jun 2017 06:20
Date: Wed, 21 Jun 2017 06:20
6 lines
1241 bytes
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.
Author: krolikbest
Date: Wed, 21 Jun 2017 17:46
Date: Wed, 21 Jun 2017 17:46
12 lines
1423 bytes
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