Delphi.cz

Český portál Delphi

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?

Případ očekávaného Access Violation

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.

Více...

Datum: 2024-06-27 15:02:00 Tagy: praxe

Praxe

Problém Ranorex a Delphi DLL

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.

Více...

Datum: 2018-12-05 20:58:00 Tagy: praxe

Praxe

BCrypt Delphi

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

Komponenty

Debugger znovu

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ř.

Watch

Více...

Datum: 2017-11-13 23:37:00 Tagy: praxe, ladeni

FastReport a dialog

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.

Dialog a FastReport

Více...

Datum: 2017-05-02 23:09:00 Tagy: FastReport, praxe

Praxe

Registration-free COM se souborem manifestu a Delphi

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ů.

Více...

Datum: 2016-10-18 20:58:00 Tagy: praxe

Praxe

HELIOS Orange zespodu, aneb jak se vyvíjí v Asseco Solutions

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:

Jednotka:

Vývoj informačního podnikového systému HELIOS Orange

Zařazení:

Asseco Solutions a.s

Historie:

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.

Úkoly:

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...

Datum: 2016-10-10 23:08:00 Tagy: praxe, delphi

FireMonkey Firmy

FastScript

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.

Více...

Datum: 2016-05-05 22:44:00 Tagy: FastReport, Object Pascal, praxe

Komponenty

Automatické vypnutí Active u následníka TDataset během nahrávání formuláře

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.

Více...

Datum: 2016-02-21 21:10:00 Tagy: praxe, hacky

Praxe

FireDac TFDMemTable

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.

Více...

Datum: 2015-11-25 00:04:00 Tagy: FireDAC, praxe

Komponenty

Pár utržků kódu k XE8

Integrovaný HTTP(s) klient

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.

Více...

Datum: 2015-04-09 21:29:00 Tagy: XE8, praxe

Novinky v Delphi Praxe

Jak jsem modernizoval UI a UX

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í. CRMPLUS 5 Více...

Datum: 2015-03-22 21:16:00 Tagy: delphi, komponenty, praxe, Virtual TreeView

Praxe

Náhodné výkřiky 48

Dneska to budou spíše takové triky.

Zmenšení velikosti zálohy instalačních souborů

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).

Komprese 1

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.

Více...

Datum: 2015-03-09 21:29:00 Tagy: vykriky, praxe

Praxe

Externí výjimka c0000005 při spouštění programu přes vzdálenou plochu

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.

RPC c0000005

Zajímavé bylo, že to obešlo můj exception handler, takže mi bylo jasné, že to není úplně normální situace.

Více...

Datum: 2014-11-04 22:01:00 Tagy: praxe

Praxe

Zvětšení dostupné paměti 32bit programů v Delphi

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).

Více...

Datum: 2014-09-19 22:09:00 Tagy: delphi, optimalizace, praxe, windows, FastMM

Praxe

Beyond Compare Lite

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).

Beyond Compare Lite

Více...

Datum: 2014-07-23 23:15:00 Tagy: praxe

Nástroje

DisposeOf, ARC, Free, WEAK a další

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.

Více...

Datum: 2014-07-11 21:28:00 Tagy: ARC, ARM, kompilátor, praxe, super, RTL

Jazyk Novinky v Delphi

Nahrazení frames za vložené formuláře

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).

Více...

Datum: 2014-06-04 23:08:00 Tagy: praxe

Začátečníci

Poslední pomoc při ladění

Dnes bych rád ukázal jeden prastarý trik, který vám může pomoci při ladění v poslední instanci.

AV

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.

Více...

Datum: 2014-03-17 23:49:00 Tagy: ladeni, praxe

Praxe

Trochu hackování 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.

Více...

Datum: 2014-01-06 22:18:00 Tagy: praxe, hacky

Návody

Potvrzení o přijetí mailu

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.

Více...

Datum: 2013-10-15 21:37:00 Tagy: synapse, praxe

Praxe

kbmMW (n-tier framework) – Rest server

Úvod

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

Filtrování Virtual Tree View

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.

Virtual TreeView

Více...

Datum: 2012-10-24 21:36:00 Tagy: Virtual TreeView, praxe

Praxe

Connection Pool

Implementace Connection Pool v Delphi.

Výhody:

  • různá vlákna mohou používat připojení (např. TIBDatabase), aniž by se musela starat o mechanismy autorizace a správy těchto připojení,
  • omezení počtu zbytečných vytváření a uvolňování připojení k databázi, která mají zpravidla značnou režii,
  • omezení maximálního počtu současně aktivních připojení jednoho uživatele a
  • nakonec to nejdůležitější: je to cool :-)))
  • Více...

    Datum: 2012-09-01 20:56:00 Tagy: db, praxe

    Praxe

Ladění za pomoci SafeMM

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.

Více...

Datum: 2012-07-04 15:01:00 Tagy: ladeni, FastMM, praxe

Výběr adresáře

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...

Datum: 2012-06-25 22:40:00 Tagy: VCL, utrzky, praxe

Praxe

Vytváření dočasných komponent za běhu

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...

Datum: 2012-06-01 23:54:00 Tagy: praxe, VCL

Praxe

Chyba pro dnešní den

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

Praxe Začátečníci

Problémy s TStringList

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...

Datum: 2012-04-17 22:35:00 Tagy: praxe, RTL

Praxe

AV při stisku ALTGr

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...

Datum: 2012-02-20 21:16:00 Tagy: hacky, praxe

Praxe