Rozcestník: Jste tu poprvé?
Pro začátečníky jsem napsal úvod do programování v Delphi.
Můžete si přečíst informace ohledně změn v jednotlivých verzích Delphi a
případně mezi jednotlivými edicemi Delphi.
Pokud přecházíte ze starších verzí tak řetezce a unicode.
Možná Vás bude zajímat spolupráce databáze a Delphi,
nebo se budete rozhodovat mezi různými druhy Delphi projektů.
Navštivte adresář nejpopulárnějších open source Delphi komponent
Platform status - podporované platformy v jednotlivých verzích
Free Delphi Starter Edition download
Potřebujete Delphi školení nebo konzultace na různá témata?
Je vedro tak to trošku okořeníme. Mějme následující kód a odhadněte bez krokování, kde a zda vůbec program spadne. Je to umělá ukázka reálné situace, kterou jsem ale trošku zamaskoval ať je to zábavnější.
Možnosti k přemýšlení: spadne to protože volám metodu na nil objektu, spadne to protože TButton v console, spadne to protože TButton má taky Click, spadne to protože se snažím vypsat Caption a to je řetezec, spadne to protože se snažím nastavit Caption a to teprve nemůže projít, spadne to protože mám lokální proměnnou v metodě u nil objektu, spadne to protože přiřazují do lokální proměnné, spadne to protože čtu lokální proměnnou nil objektu, spadne to náhodou a jen někdy.
Nebo to v klidu projde vše. Jako je to trošku vyšší level, ale zkuste.
program TestAV;
{$APPTYPE CONSOLE}
{$R *.res}
uses
WinApi.Windows, System.SysUtils, System.Classes, WinApi.Messages, Vcl.StdCtrls;
type
TTestButton = class(TButton)
public
procedure Click;
end;
procedure TTestButton.Click;
var
x: Integer;
begin
writeln('button.Click'); // Line A
writeln(Caption); // Line B
Caption := 'Button 23'; // Line C
x := ImageIndex; // Line D
writeln(IntToStr(x)); // Line E
end;
var
t: TTestButton;
begin
try
t:=nil;
t.Click; // Line F
t.Free; // line G
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
Datum: 2024-06-27 15:02:00 Tagy: praxe
Minulý týden jsem narazil na problém kdy testovací oddělení začalo hlásit problémy při běhu programu na kterém spolupracuji pod Ranorexem.
Odbočka: Ranorex nedávno získala IDERA, tj. vlastník Embarcadero. Tím rozšířila své portfolio pro vývoj aplikací o další zářez, kompletní seznam je na ideracorp.com a obsahuje kromě Embarcadero další akvizice z nedávné doby jako Sencha, Whole Tomato, Test Rail atd. přičemž některé produkty jsou nyní přibalovány k vyšším edicím Delphi. Mimochodem když se podíváte na ideracorp.com/news, uvidíte, že všechny akvizice jsou až po získání Delphi - celkem velké investice do rozšíření portfolia a celkem ve svižném tempu.
Ale zpět k našemu problému s Ranorexem.
Datum: 2018-12-05 20:58:00 Tagy: praxe
BCrypt je populární algoritmus pro hashování hesel. Mezi jeho výhody patří kvalitní dokumentace, standardizovaný, stejný napříč platformami a jazyky (třeba PHP). Více...
Datum: 2018-06-02 22:45:00 Tagy: praxe, open source
Ladění je jako vyšetřování vraždy, kdy je člověk sám vrahem. Některé věci užitečné pro ladění jsem naznačoval dříve, ale možná je vhodné je připomenout.
Jedna z nich je okno Evaluate/modify, kde můžete zadat nejen název proměnné, ale prakticky libovolný řádek kódu Delphi a ten bude spuštěn z kontextu laděného procesu. Tedy např.
Datum: 2017-11-13 23:37:00 Tagy: praxe, ladeni
Mám rád FastReport. Už jsem se mu zde několikrát věnoval, např. jak využít FastScript. Ale až nedávno jsem začal používat ve skriptech dialog.
K čemu je to dobré? Umožňuje mi to flexibilněji reagovat na specifické požadavky uživatelů bez úprav hlavního programu. Lehkou úpravou FastReportu mám zabezpečeno streamování reportů z a do databáze (pořád se držím teze, že na data jsou databáze a kromě ini tam patří v rámci možností vše). To mi umožňuje lehce přidat libovolný report a okamžitě ho uživatel může začít používat. Navíc dialog uložený v reportu rozšíří základní funkcionalitu.
Datum: 2017-05-02 23:09:00 Tagy: FastReport, praxe
Nemám moc rád technologii COM, hlavně protože jinak k prakticky samostatnému EXE vygenerovaného Delphi (případně s dalšími DLL v adresáři programu) zavádí závislosti na něčem, co musí být registrované v systému, což je z mého pohledu zásadní problém a moc se to neslučuje s mojí filozofií programů.
Datum: 2016-10-18 20:58:00 Tagy: praxe
Zvažuje-li začínající programátor, kde by mohl uplatnit své schopnosti, má zpravidla o pozicích týkajících se větších IS, představu všední, nezajímavé a poklidné práce. Velmi často je však tato představa mylná a situace nezřídka připomíná vojenské operace, ať už z hlediska strategického, taktického nebo operačního. Kdo někdy řešil scénář „V pátek úředník vydá vyhlášku a v pondělí podle ní musí uživatelé odevzdat hlášení.“ ví, co mám na mysli.
Omlouvám se tedy všem pacifistům, ale marná sláva, armáda má v organizaci, použití různých zkratek, kódů a hlášeních letitou tradici a občas není špatné se u ní inspirovat. Snad vám tedy strohý vojenský výčet faktů poskytne přehledně základní informace:
Vývoj informačního podnikového systému HELIOS Orange
Asseco Solutions a.s
Jednotka se může opřít o bohaté bojové zkušenosti. Déle sloužící veteráni jsou u jednotky i více než 20 let.
Poskytovat krytí pro operace více než 6000 zákazníků v oblasti 4 500 000+ řádků zdrojového kódu a více než 1000 dialogových oken. Provádět průzkumnou činnost na území legislativní džungle.
Reagovat na změny taktické situace ve všech zájmových oblastech.
Udržovat vysokou úroveň připravenosti na všechno. Více...
Pokud jste šťastným uživatelem FastReportu, možná ani nevíte, že FastReport obsahuje i FastScript a že se dá použít nezávisle bez generování reportů. Co je to FastScript? Je to knihovna pro provádění skriptů v různých jazycích (Pascal, JS, C++, VB). Skripty mohou být celé programy, ale i obyčejný výraz. FastScript vám dává do ruky opravdu mocný nástroj.
Datum: 2016-05-05 22:44:00 Tagy: FastReport, Object Pascal, praxe
Pokud používáte vkládání DB komponent přímo na formulář (třeba do DataModule), občas se může stát, že zapomenete nastaveno TDataSetxx.Active := True, což může velmi zpomalit start programu a mít další vedlejší efekty.
Když přejdu to, že si myslím, že je lepší vytvářet Db komponenty až za běhu (nebo aspoň mít vlastního následníka, v kterém úpravu provedeme) a ne v design modu, existuje možnost jak to vyřešit.
Trošku méně známou součástí FireDAC je TFDMemTable alias memory table. TFDMemTable můžete používat jako jednoduchý dataset s čtením a zápisem do JSON, XML nebo binárních dat, nebo jako lokální dataset pro DBMS nebo navíc použít CachedUpdates, případně za pomocí LocalSQL provádět SQL příkazy nad skupinou TFDMemTables.
Podle mne těžce inspirovaný .NET, https bez OpenSSL.
implementation
uses
System.Net.httpclient,System.Net.URLClient;
{$R *.dfm}
procedure TForm7.Button1Click(Sender: TObject);
var
o: THTTPClient;
response: IHTTPResponse;
r: TNameValuePair;
begin
o := THTTPClient.Create;
try
response:=o.Get('https://www.google.com/');
for r in response.Headers do
memo1.Lines.Add(r.Name + '='+r.Value);
Memo1.Lines.Add(response.ContentAsString);
finally
o.Free;
end;
end;
No synapse to není, ale je to integrované v RTL a něco to umí. Více snad později.
Posledních pár měsíců jsem s přestávkami pracoval na modernizaci UI a UX našeho programu. Cílem bylo popotáhnout vzhled UI aplikace (doufám) do současnosti a z hlediska UX odstranit několik historických nešvarů jako např. většinu modálních dialogů.
Zkusím naznačit některé věci, které jsem použil a doufám, že to někomu pomůže, nebo aspoň pobaví. Více...
Datum: 2015-03-22 21:16:00 Tagy: delphi, komponenty, praxe, Virtual TreeView
Dneska to budou spíše takové triky.
Instalátor Delphi je napsán v Install Aware, který bohužel ještě z různých důvodů (asi politických) spolupracuje s Microsoftim MSI. Nejen, že MSI je totální neefektivní (např. při reinstalaci otevírá prý každý soubor 4x - proto taky Delphi dělají unistall a nový install), ale ještě se ukládají informace pro reinstalaci do c:\ProgramData (to jde nějak změnit parametrem).
Problémem je, že v době SSD disků a VMWare jsou disky C malé a takové XE7 tak napráská 10GB dat, které se už moc nepoužijí. Bohužel do doby než se vykopne MSI s tím moc neuděláme.
Nedávno jsem řešil problém. U jednoho zákazníka, který spouští naše CRMplus přes vzdálenou plochu na (myslím) Windows Serveru 2008 se v určitém případě objevovala zvláštní výjimka.
Zajímavé bylo, že to obešlo můj exception handler, takže mi bylo jasné, že to není úplně normální situace.
Datum: 2014-11-04 22:01:00 Tagy: praxe
Jednoho krásného dne Váš program zjistí, že trpí nedostatkem paměti. Přirozeným krokem je přechod na 64bit aplikace, ale existuje i jiná možnost. U EXE (resp. PE souboru) se dá specifikovat flag IMAGE_FILE_LARGE_ADDRESS_AWARE. Tento flag byl původně určen pro speciální mód 32bit Windows, kdy místo normálních cca 2GB paměti pro 32bit proces nabízel celých úžasných 3GB volné paměti. Praktická využitelnost tedy nic moc, protože tento mód Windows se moc nepoužíval.
Situace se obrátila s příchodem 64bit Windows (jen aby nedošlo k nedorozumnění - dávejte pozor kdy mluvím o 32bit procesu, kdy o 32bit Windows a kdy o 64bit Windows).
Datum: 2014-09-19 22:09:00 Tagy: delphi, optimalizace, praxe, windows, FastMM
Od verze XE je součástí instalace Beyond Compare Lite, najdete ho v adresáři Delphi/bin/BCompareLite.exe . Pokud ho ještě neznáte - dejte mu šanci. Plnou verzi znám jen z doslechu (slučování ze tří zdrojů, synchronizace adresářů…), ale i v lite verzi je pro mne významné plus např. to, že program umí rozeznávat důležité změny (tj. rozdíl mezi změnou v poznámce, příkazu nebo např. v řetězci).
Datum: 2014-07-23 23:15:00 Tagy: praxe
Laskavý čtenář mého blogu jistě už naznal, že Delphi neznamená jen Win32 (Win64, OSX) ale i kompilátory pro iOS a Android.
Tyto kompilátory (kromě kompilace do ARM) přinášejí i podporu ARC (Automatic Reference Counting) pro objekty (podobně jako k tomu došlo před nedávnem Apple). Princip není v Delphi v podstatě nový - Delphi odjakživa používají stejný mechanismus nejméně pro řetězce a interface.
V podstatě existují dvě možnosti automatického uvolňování paměti - ARC a Garbage Collector, kdy GC je ten nedeterministický (tj. problematický viz Android a nový runtime ART to taky řeší), ale to sem asi nepatří.
Obecně ale oba modely musí řešit cyklické reference. Takže ARC je moc pěkné, ale není vše tak sluníčkové jak by mohlo vypadat. V nejhorším ale jen nedojde k uvolnění, pokud se tomu chceme vyhnout, je nutno jít trochu hlouběji. Upozorňuji, že právě následující text jde v některých detailech hlouběji než je nutné pro normálního programátora.
Datum: 2014-07-11 21:28:00 Tagy: ARC, ARM, kompilátor, praxe, super, RTL
Tento trik určitě většina programátorů zná, ale třeba to někomu pomůže a mimochodem to ukazuje genialitu návrhu Delphi.
Jistě je Vám známo co jsou to frames - jedná se o pseudo okna, která můžete v IDE designovat a pak je používat v jiných formulářích. Je to celkem slušné řešení, ale není to úplně ono. Má to jisté omezení, sem tam IDE nefunguje 100% podle toho co si představuji atd. Postupně jsem přešel na méně RAD přístup, a to "injektování" formuláře do jiného controlu na jiném formuláři (já tomu říkám osobně dokování, ale dokování je v Delphi něco jiného).
Datum: 2014-06-04 23:08:00 Tagy: praxe
Dnes bych rád ukázal jeden prastarý trik, který vám může pomoci při ladění v poslední instanci.
Delphi v normální situaci instaluje globální ovladač výjimek, který odchytává vaše problémy (to je to okno které se zobrazí při výjimce). Tento globální ovladač samozřejmě můžete nahradit vlastním, je na to několik knihoven - podrobněji jsem o tom psal dříve - Exception dialog v Delphi.
Tento článek nepojednává o tom, jak obejít ochranu v RAD Studiu nebo MS Office, podíváme se spíš na to, jak modifikovat cizí kód, aniž bychom museli upravovat původní unity.
P.S.:Jedná se o pokračování a rozšíření mého seriálu o háčcích v Delphi (viz. tag hacky), tentokrát z pera Ondřeje Pokorného (www.kluug.net, už jsem ho několikrát odkazoval) / poznámka administrátora.
Nedávno jsem programoval komunikační modul do našeho systému a jedna z jeho součástí byla funkce potvrzování doručení mailů a to na obou úrovních které znám.
Samozřejmě jsem použil jako vždy Synapsi a rád bych zde o tom napsal několik poznámek.
Oprava: v tom MailToDNS byla chybka - za tím rfc822 se má přidat emailová adresa. Opraveno. Sice to fungovalo i tak, ale přesto.
Minule jsem slíbil článek na téma REST server v Delphi pomocí kbmMW a tady je výsledek. Celý článek je postaven na reálných zkušenostech, které jsme doposud získali. Více...
Datum: 2012-12-11 00:51:00 Tagy: REST, JSON, praxe
Moc se mi líbí způsob vyhledávání ala Windows 7 nebo novější Delphi IDE, tj. začnete psát a zobrazují se vám jen relevantní záznamy. Přemýšlel jsem, jak je to těžké udělat pro můj milovaný švýcarský nůž mezi komponentami aka TVirtualTreeView. Jelikož právě v Delphi IDE je použit modifikovaný VirtualTreeView tak jsem doufal, že to až takový problém nebude. A nebyl.
Datum: 2012-10-24 21:36:00 Tagy: Virtual TreeView, praxe
Implementace Connection Pool v Delphi.
Výhody:
Pravidelní čtenáři snad chápou, že se tématu ladění věnuji dost podrobně.
Schopnost najít chybu je podle mne to, co odlišuje vynikajícího programátora od zbytku. Postupně jsem se snažil ukazovat různé nástroje a finty jak si práci v této oblasti zjednodušit (počínaje fulldebug mode u FastMM, přes seriál o debuggeru atd).
Dnes ukáži zajímavou možnost a tou je SafeMM.
Datum: 2012-07-04 15:01:00 Tagy: ladeni, FastMM, praxe
V programu je bohužel často nutné dovolit, aby si uživatel mohl zvolit adresář (pro mladší čtenáře složku) na disku. Když budu ignorovat fakt, že jakákoliv svoboda volby uživatele zmate, dostáváme se k tomu, jak to jednoduše naprogramovat. Více...
Mějme klasický kód, tj. vytvoříme dynamicky za běhu formulář a modálně ho zobrazíme.
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
try
ShowModal;
finally
Free;
end;
end;
end;
Nepovažuji se za nejostřejší nůž v šuplíku a tudíž se možná pletu, ale je zde malé ale. Více...
Je třeba to zveřejnit jako odstrašující případ (kód je trochu upraven)
const
ciTabBarInterval = 0;
ciTabBarDay = 1;
ciTabBarWeek = 2;
var
bIsInterval: Boolean;
…
bIsInterval:= not TabBar.SelectedTab.Index in [ciTabBarDay, ciTabBarWeek];
Problém byl, když byl TabBar.SelectedTab.Index = 0. Takto samostatně je to evidentní že? Více...
Datum: 2012-04-19 17:40:00 Tagy: začátečníci, praxe, utrzky
Přišel mi mail od čtenáře Jiří Milička a zkusím ho zde publikovat - třeba to někomu pomůže.
Ve zkratce tvrdí, že přišel na dvě chyby s TStringList: Více...
Pokud používáte Delphi 7 - Delphi 2007 (možná i starší) tak dejte pozor na možný problém s pravým tlačítkem ALT (aka ALTGr). Problém byl vyřešen v D2009. Více...