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

Android 13 a práce se soubory

S příchodem Androidu 11 google zpřísnil přístup k souborům, které nejsou přímo vaše, ale jsou sdílené (třeba na SD kartě atd). Do verze Android 12 to šlo potlačit přes manifest a requestLegacyExternalStorage, ale s příchodem Androidu 13 se situace změnila.

Více...

Datum: 2024-01-24 18:30:00 Tagy: Android

FireMonkey Praxe

Automatické generování jména package dle verze

Jelikož není žádným tajemstvím, že Delphi 12 snad brzo bude - viz. náznaky beta blogování (taky snad něco brzy napíši pod explicitním povolením od Embarcadera), tak bych rád zdůraznil jednu opomíjenou vlastnost novějších verzí Delphi - je na to IMHO ideální čas.

Jako každý programátor jsem měl problémy s balíčky komponent a novými verzemi, kdy aby nedošlo k problémům se soubory (dependency hell), má vždy balíček pro danou verzi jiný název. Klasicky obsahuje číslo verze, viz. samotné Delphi - např. FireDAC280.bpl, vcl280.bpl atd. Pro mne tak byl vždy největší opruz dodělávat balíčky pro novou verzi, a to v případě kdy to neudělal vývojář.

Naštěstí už několik verzí (podle všeho od D10.4 - viz třeba balíčky VirtualTreeView) je tu řešení: automatické generování suffixu a teď je ideální čas se tím zabývat. Za ten ušetřený čas v budoucnu do stojí.

LIB suffix

Více...

Datum: 2023-10-19 20:01:00 Tagy: IDE

Návody Praxe

Monitorování stavu resources v aplikaci

Často píšu programy které běží dlouho a tak mne zajímá, zda se tam neděje něco co nechci. V takovém případě si do logu zapisuji stav programu (tedy kromě jiného samozřejmě). Sice existují knihovny, ale pro mé potřeby většinou stačí jednoduchá funkce.

demo resourcestatus

Více...

Datum: 2023-08-11 15:12:00 Tagy:

Praxe

UDP Broadcast nejen pro Android za pomocí System.Net.Socket

Vždycky jsem UDP psal pomocí Synapse, ale chtěl jsem zkusit něco nového a chtěl jsem to pro Android za pomoci inhouse řešení - i když je Synapse pro Android je dostupná.

Server byl existující synapse UDP server (tady je sample public:howto:udpserver) pro windows, který na zaslaný řetezec <ident> vrátil název počítače, takže jsem během chvilky dostal seznam dostupných stanic i s IP adresou pro připojení z Androidího klienta.

Více...

Datum: 2023-05-11 19:48:00 Tagy: synapse, server, Threading

Praxe

TListView ve Firemonkey

TListView ve FMX má celkem zajímavé možnosti, které nejsou na první pohled dostupné a některé si ukážeme.

TListView

Více...

Datum: 2022-12-07 18:17:00 Tagy: FireMonkey

Praxe

Nastavení verze aplikace pro všechny platformy najednou

Delphi od určité verze (Delphi XE2?) podporuje nastavení verze pro každý TARGET samostatně. Chápu, že to může mít někdy přínosné, ale osobně s tím bojuji, koncept All platforms mi moc nefunguje a spíše mne to otravuje. Takže jsem začal hledat nějaké řešení a výsledkem je používání DDevExtension, které napsal autor FixPacku a které nedávno uvolnil jako open source a psal jsem o tom i zde na serveru.

Version info

Více...

Datum: 2022-07-05 12:15:00 Tagy: DDEV

Praxe Rozšíření Delphi

Dvakrát tip pro debugger

Dlouho jsem nepsal o nějaké fintě pro ladění, tak jsem si vzpomněl na takové dvě drobnosti:

Zobrazení dat z memory stream

Samozřejmě se nejedná jen o memory stream jelikož se jedná o populární bázovou třídu tak to použijeme častěji. Pokud jste v místě, kde máte parametr TStream, není nic jednoduššího než přes volání .ClassName zjistit zda se jedná o potomka TMemoryStreamu, objekt přetypovat a použít následující trik (napadl mne, když jsem ladil volání SOAP a pořád jsem logoval stream do souboru abych ho zkontroloval).

Více...

Datum: 2022-06-27 22:58:00 Tagy: debugger

Praxe

Použítí synapse v THTTPRIO při volání SOAP

Pokud potřebujete používat SOAP, tj. web services, má Delphi léta pro to podporu přes THTTPRIO. Od verze 10.3 RIO je jako komunikační vrstva použit THTTPClient, což je ve většině případů optimální řešení, protože používá preferované řešení operačního systému (např. na Windows SChannel).

Ale: mohou nastat případy, kdy dané řešení nevyhovuje, a pak je tu možnost relativně jednoduše nahradit komunikaci za vlastní (v mém případě to bylo nutnost rychlé změny self signed klientských certifikátů na různých OS). Zvolil jsem synapse. Takže jdeme na to, není to nic hrozného.

Více...

Datum: 2022-03-30 07:48:00 Tagy: SOAP, synapse

Praxe

FastMM4 AVX, FastMM5

Už je to nějakou dobu, co jsem psal o FastMM4 naposledy a mezitím se něco změnilo. Vývoj FastMM4 byl nahrazen za FastMM5 s možnou komerční licencí a objevil se fork FastMM4-AVX. Fork mají na svědomí autoři známého emailového klienta Bat!, což není špatná vizitka. Více...

Datum: 2020-08-13 15:21:00 Tagy: FastMM

Komponenty Praxe

Implementujeme iterator pro Bookmarklist

Už od verze 2007 Delphi podporuje procházení přes for - in, bohužel některé třídy stále tuto podporu nemají.

Požadovaný stav:

var
  bmk: TBookmark;
begin
  for bmk in  DBGrid1.SelectedRows do
  begin
//xxx
  end;
end;

Více...

Datum: 2019-03-26 21:14:00 Tagy: db

Delphi Praxe Rozšíření Delphi

Zajimavé předávání parametrů pro OLE

Sem tam mne Delphi překvapí. Nepřijde vám ta syntaxe u PrintOut trochu zajímavá? Delphi prý to podporují od verze 2. Myslím, že na pořadí ani nezáleží.

  if (OpenDialog1.Execute) then
  begin
    WinWord := CreateOleObject('Word.Application');
    if (not (VarIsEmpty(WinWord))) then
    begin
      try
        WinWord.Visible := false;
        Docs := WinWord.Documents;
        Doc := Docs.Open(OpenDialog1.FileName);
        vFrom := 1;
        vTo := 2;
        Doc.PrintOut(Background := false, Append := false, Range := wdPrintFromTo, OutputFileName := EmptyParam, From := vFrom, To := vTo);
                  // err
      finally
        WinWord.Quit;
      end;
    end;

Jen pro připomenutí - PrintOut má mnoho parametrů - word.document.printout

Více...

Datum: 2019-01-21 23:14:00 Tagy:

Praxe

FireDAC a connection pool

Méně známou vlastností FireDAC je, že obsahuje přímo podporu pro Connection Pool.

Co je Connection pool? Connection pool je třída obsahujicí kolekci otevřených připojeni. V případě vícevláknových aplikací (tj. např. všechny ty REST servery nebo cokoliv kde obsluhuje více požadavků zároveň, případně i normální aplikace, kde používáte více dynamických connection) většinou potřebují přístup do databáze.

FireDAC je threadsafe (tj. bezpečné použítí ve vláknu) jen v případě, že vlákno má vlastní Connection (to je normální požadavek napříč jazyky nebo platformami). Přičemž největší režie je právě vytvoření připojení do DB. Proto se používá mechanismus ConnectionPool, kdy už nepoužívané Connection objekty jsou po nějakou dobu k dispozici a další požadavek na novou connection bude uspokojen některou z těchto Connection.

Nebojte se, FireDAC to má elegantně vyřešeno.

Více...

Datum: 2018-12-16 09:57:00 Tagy: FireDAC

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

webbroker a http.sys

Od Windows XP SP2, resp. Windows Server 2003 operační systém windows obsahuje driver jádra pro obsluhu http požadavků s názvem http.sys. Ve skutečnosti se jedná o plný HTTP server a to přímo v jádře - což mimochodem znamená, že je na nižší úrovni než třeba IIS nebo Apache a bez veškerých závislostí.

Webbroker nabízí několik možností jak překládat výsledné aplikace (např. jako standalone web server), ale http.sys je prostě jiná liga. To si uvědomují i tvůrci komponent, jako např. TMS Sparkle - což je základem jejich nového Delphi web frameworku (pas to JS compiler) WebCore, nebo Intraweb.

A samozřejmě Open Source implementace - Synopse http.sys.

Více...

Datum: 2018-09-18 21:34:00 Tagy: webbroker, web

Praxe

MMX code explorer a wizard na metody

Minule jsem psal o MMX code explorer a jeho uvolnění volně ke stažení a tak jsem si řekl, že ho taky zkusím - třeba tam opravdu bude (někdo to naznačoval).

Často píši kód způsobem, že napíši nějakou část a v rámci ní dám volání metod, které následně vytvořím (programování shora dolů). Vždy mi ale chyběla funkce, která by mi ty metodu vygenerovala s korektními parametry.

Více...

Datum: 2018-07-02 22:18:00 Tagy: IDE, MMX

Návody Praxe

Multiline ListView bez custom draw

Nedávno jsem narazil na prima háček jak udělat v určitých případech víceřádkové ListView položky bez vlastního kreslení.

Multi line listview

Ač zastánce VirtualTreeView, sem tam se hodí ListView v report módu a víceřádkový text s fixní výškou.

Více...

Datum: 2018-04-01 23:19:00 Tagy: VCL

Praxe

Případ FieldByName

Jak se tak potuluji po zákaznících se školením nebo konzultacemi, tak narážím na opakovanou situaci s FieldByName (případně podobnými funkcemi).

Více...

Datum: 2018-03-05 23:36:00 Tagy: db, ladeni, optimalizace

Optimalizace Praxe

Změna pozice vykonávání při ladění programu

Je mi jasné, že jsem o tom již kdysi psal, ale opakovaně na školeních, které provádím, narážím na tuto vlastnost IDE, která je pro mnohé překvapením: jednoduchá změna pozice aktuálního řádku provádění kódu. Nejedná se o žádnou novinku, ale o věc cca z verze Delphi 2010.

Aktuální pozice je ukázána šipkou, viz obrázek.

debugger

Více...

Datum: 2017-11-04 21:41:00 Tagy: ladeni

Praxe

Instalace FireDAC do starých Delphi

FireDac je cool a je součástí novějších Delphi. Ale je mi jasné, že i když nové projekty máte v nových verzích, může se stát, že některý starší projekt zůstává na neunicode verzích, ale přesto by jste rádi i v něm FiredDAC.

Pokud máte legální Delphi XE4 nebo XE3 Enterprise+ (což není zase takový problém, protože součástí každé vyšší verze si můžete vyžádat licenci na starší verze), můžete zkusit stáhnout FireDAC z CodeCentral, poslední verze je cc.embarcadero.com/Item/29458 pro XE4, resp. cc.embarcadero.com/item/29318 pro XE3.

No a pak stačí jen spustit instalátor s parameterem /ShowIDE

FireDac ShowIDE

Více...

Datum: 2017-10-08 23:50:00 Tagy: FireDAC

Praxe

RoadMap, Error Insight a IDEFixPack versus Tokyo

EMBT vydalo novou roadmap RoadMap září 2017.

Je znatelný důraz na VCL, Windows 10, High DPI. Novinky v jazyce mají přijít až s další verzí a některé nativní prvky pro Android (input pole, což by mělo řešit bidi vstupy) taky. Zásadnější je 64bit kompilátor pro OS X, což ve spojení s CrossVCL je velmi zajímavé.

Mimochodem: netajím se obdivem k CrossVCL, protože podle všeho chlapci dokázali vyřešit problém VCL x ARC, jak je vidno na kompilátoru pro Linux. Musela být ohromná fuška napsat znovu od píky RichEdit, TreeView, ListView (sice jen v modu Report) atd a to bez podpory WinAPI. To nemluvím o části GDI+ napsané taky z nuly. To pak port Virtual TreeView byl asi proti tomu zábava. Kukněte na Screenshoty a žasněte.

Více...

Datum: 2017-09-19 21:51:00 Tagy: IDE

Delphi Praxe

Náhodné výkřiky 56

Přináším další dávku odkazů co mne zaujalo.

Na embt foru šla informace o tom, že někdo vytvořil nativní androidí FMX TEdit a TMemo - svn.code.sf.net/p/alcinoe/code/source/. Je to součást balíku, který jsem již odkazoval a obsahuje zajímavé další pecky.

Člověk se pořád učí:

net use x: \\http://live.sysinternals.com

Více...

Datum: 2017-07-03 23:04:00 Tagy: webbroker, web, IoT, synapse, REST, Android

Komponenty Praxe

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

Delphi 10.2 Tokyo je dostupné

Embarcadero dnes (22.3.2017) vydalo další verzi Delphi a C++Builder s podtitulem Tokyo. Hlavní nosnou myšlenkou je přidání kompilace pro Linux 64 bit, bohužel jen pro Enterprise+ edice (nebudu se k tomu dále vyjadřovat).

Co je nového: What's_New, dále Feature matrix, seznam opravených chyb (některé velmi prehistorické).

Download: webinstaller, ISO, FastReport VCL.

Více...

Datum: 2017-03-22 23:20:00 Tagy: delphi, linux

Novinky Praxe

Programovanie poslepu – dá sa to?

Narodil som sa v čase, keď počítače neboli bežnou súčasťou domácnosti a hoci na strednej škole sme už informatiku mali, veľmi mi to nepomohlo. V 11-tich rokoch som totiž prišiel o zrak a tak bolo nemysliteľné, aby som si sadol za počítač a niečo na ňom urobil. Až v druhej polovici 90-tych rokov sa začalo hovoriť o tom, že aj nevidiaci budú môcť používať počítač a to vďaka špeciálnym programom – čítačom obrazovky – screenreaderom – ktoré budú zabezpečovať komunikáciu počítača s nevidiacim. To som bol už na vysokej škole a ako technický typ som po tejto novinke hneď siahol a stal sa aktívnym užívateľom Windows. Čoskoro sa ale ukázalo, že nie všetko je tak, ako sa zdá.

Více...

Datum: 2017-02-06 19:58:00 Tagy:

Praxe

TBCD v Delphi

Podle mne ne moc známá věc je implementace BCD v Delphi. BCD je způsob uložení čísel s fixní přesností. BCD je v Delphi reprezentován záznamem TBCD definovaným v jednotce Data.FmtBCD, případně FMTBcd (ve starších verzích, nejméně D2007).

Více...

Datum: 2017-01-30 23:03:00 Tagy: RTL

Praxe

Delphi a Windows Desktop App Converter

Integrace podpory Windows Desktop Bridge

Název Desktop Bridge je poměrně nový, dřív nesl tento projekt název Centennial. Jde o jeden z projektů MS, které měly přivést pod křídla UWP (Universal Windows Platform) aplikace z jiných ekosystémů. Původně existovaly tři zásadní projekty pro převod z Win32, Android a iOS ale v průběhu času byl projekt pro převod Android aplikací ukončen. Aktuálně jsou tedy k dispozici dva hlavní (dle mého soudu) nástroje pro převod aplikací z iOS (iOS Bridge) a Windows (Desktop Bridge). Doplňují je nástroje pro převod mobilních aplikací v Silverlight z Windows Mobile 8.1 (Mobilize.Net’s Silverlight Bridge) a pro převod webových aplikací (Hosted Web Apps). Pokud vás zajímají podrobnosti nahlédněte přímo na stránky MS: developer.microsoft.com/en-us/windows/bridges.

Nás pochopitelně zásadně zajímá Desktop Bridge a protože byl uvolněn pro veřejnost v rámci Windows 10 Anniversary Update v srpnu letošního roku, můžeme ho začít využívat hned teď.

Existují dvě možnosti, jak z klasické Win32 aplikace vyrobit APPX balíček:

  • Automatická konverze z instalačního balíčku (EXE nebo MSI)
  • Ruční konverze EXE souboru aplikace.

V prvním případě jde o nástroj DesktopAppConverter.exe. Používá se v případě, že máme k dispozici instalátor aplikace (EXE nebo MSI) a v podstatě nejprve vytvoří virtuální instanci Windows 10, ve kterých pak následně spustí instalátor. Průběh instalace a její výsledek zaznamená a vytvoří APPX, který obsahuje obraz výsledku instalace. Po nainstalování vytvořeného APPX má zapouzdřený EXE k dispozici vlastní kopii registrů a souborů vytvořených či změněných v rámci sledované instalace při konverzi. Vše je oddělené od okolí sandboxem, ve kterém pak výsledná aplikace běží.

Jestliže již používáte nějaký nástroj typu InstallAware nebo InstallShield pro vytvoření instalačního balíčku, můžete tento způsob zkusit, pokud poběží vše bez problémů je nejjednodušší a nejméně pracná cesta.

Více...

Datum: 2016-12-20 23:38:00 Tagy: Windows10

Novinky v Delphi Praxe

DLL a WideString

Myslím, že normální programátor používající DLL v Delphi obecně chápe, že předávat string jako parametr do DLL není možné bez použití berličky typu SimpleShareMem, která propojí memory manager v hlavní aplikaci s memory managerem v DLL. Což ovšem znemožňuje použití DLL z jiných jazyků a proto se musíme snížit na úroveň předávání přes PChar nebo PWideChar.

Více...

Datum: 2016-11-26 22:37:00 Tagy: DLL, FastMM, RTL

Delphi 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

Chyba dne

Při jedné konzultaci jsem našel zajímavou chybu v jedné části zákazníkova programu. Myslím, že je to pěkný příklad.

//LEAK !
var
  ads: TADOQuery;
begin
  ads := TADOQuery.Create(nil);
  ads.Connection := ADOConnection1;
  with ads, SQL do
  begin
    try
      Text := 'SELECT * FROM tCRM_Currency';
      Open;
      try
        while not Eof do
        begin
          //………..
          Next;
        end;
      finally
        Close;
      end;
    finally
      Free;
    end;
  end;
end;

Zkuste ji první najít samostatně. Více...

Datum: 2016-08-26 23:23:00 Tagy: Object Pascal

Praxe