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
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.
Datum: 2024-01-24 18:30:00 Tagy: Android
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í.
Datum: 2023-10-19 20:01:00 Tagy: IDE
Č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.
Datum: 2023-08-11 15:12:00 Tagy:
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.
TListView ve FMX má celkem zajímavé možnosti, které nejsou na první pohled dostupné a některé si ukážeme.
Datum: 2022-12-07 18:17:00 Tagy: FireMonkey
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.
Datum: 2022-07-05 12:15:00 Tagy: DDEV
Dlouho jsem nepsal o nějaké fintě pro ladění, tak jsem si vzpomněl na takové dvě drobnosti:
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).
Datum: 2022-06-27 22:58:00 Tagy: debugger
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.
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
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;
Datum: 2019-03-26 21:14:00 Tagy: db
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:
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.
Datum: 2018-12-16 09:57:00 Tagy: FireDAC
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
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.
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.
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í.
Ač zastánce VirtualTreeView, sem tam se hodí ListView v report módu a víceřádkový text s fixní výškou.
Datum: 2018-04-01 23:19:00 Tagy: VCL
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).
Datum: 2018-03-05 23:36:00 Tagy: db, ladeni, optimalizace
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.
Datum: 2017-11-04 21:41:00 Tagy: ladeni
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
Více...Datum: 2017-10-08 23:50:00 Tagy: FireDAC
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.
Datum: 2017-09-19 21:51:00 Tagy: IDE
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
Datum: 2017-07-03 23:04:00 Tagy: webbroker, web, IoT, synapse, REST, Android
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
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.
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á.
Datum: 2017-02-06 19:58:00 Tagy:
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).
Datum: 2017-01-30 23:03:00 Tagy: RTL
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:
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.
Datum: 2016-12-20 23:38:00 Tagy: Windows10
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.
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
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