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 si všimněte mého pojednání ř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ů.
Uvažujete o vývoji pro mobilní zařízení? V tom případě navštivte sekci FireMonkey.

Pokud Vám nestačí náš přehled komponent, 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?


Delphi trik 6: generické anonymní metody

vložil Radek Červinka 17. května 2020 22:30

V novějších Delphi, nejméně XE3 - hlouběji jsem se nedíval, je v jednotce System.SysUtils definováno pár generických a zaroveň anonymních metod.

// Generic Anonymous method declarations
type
  TProc = reference to procedure;
  TProc<T> = reference to procedure (Arg1: T);
  TProc<T1,T2> = reference to procedure (Arg1: T1; Arg2: T2);
  TProc<T1,T2,T3> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
  TProc<T1,T2,T3,T4> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4);

  TFunc<TResult> = reference to function: TResult;
  TFunc<T,TResult> = reference to function (Arg1: T): TResult;
  TFunc<T1,T2,TResult> = reference to function (Arg1: T1; Arg2: T2): TResult;
  TFunc<T1,T2,T3,TResult> = reference to function (Arg1: T1; Arg2: T2; Arg3: T3): TResult;
  TFunc<T1,T2,T3,T4,TResult> = reference to function (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4): TResult;

  TPredicate<T> = reference to function (Arg1: T): Boolean;

Více...

Tagy:

trik

Delphi trik 5: zrychlení kompilace

vložil Radek Červinka 17. března 2020 23:18

Je několik možností jak zrychlit build aplikace (budeme ignorovat nový HW).

Většinou stačí mít dobře stukturovaný projekt bez kruhových referencí, tj. že kompilátor nic nemusí řešit a jde od základních unit směrem k složitějším. Samozřejmě IDEFixPack hlavně pro starší verze také pomůže, ale následující už tak známé není.

Pokud máte hodně jader je možné, že se už začne projevovat přehazování scheduleru Windows, což zejména u starších verzí (třeba XE) může způsobit už trošku zpomalení.

Zkuste ve správci úloh omezit počet procesorů (osvědčilo se mi na 2 kousky) - nebojte se, platí to jen pro aktuálně spuštěný program, Windows si to nezapamatují.

bds

bds

Tímto způsobem jsem zrychlil kompilaci 1.2MLOC z cca 28s na 19s, což není špatné.

Pokud to zafunguje a má to přínos, máte několik možností (kromě na to zapomenout):

  • Process Lasso
  • teoreticky se dá patchnout bds.exe, v exe je info o tom na kolika procesorech to má běžet, je na to malinký program, který byl kdysi součástí Windows 2000 Server Resource Kit a použivají to převážně hráči na patch starších her, které na více jádrových systémech neběží - https://robpol86.com/imagecfg.html , nezkoušel jsem

V důsledku nefunguje jen rychleji kompilace, ale i třeba napovídání atd. což do brzké (doufám že v další verzi) doby než bude napovídání kódu řešeno přes language server taky potěší.

Tagy:

trik

Delphi trik 4: Disable Windows Ghosting

vložil Radek Červinka 1. března 2020 22:34

Na fóru Karel Horký sdílel pěkný tip řešící občasný problém s mizením modálního okna za hlavní formulář (např. při různých přepínání - nemyslím TForm.PopupMode) často ve Windows 10.

procedure DisableProcessWindowsGhosting;
var
  DisableProcessWindowsGhostingProc: procedure;
begin
  DisableProcessWindowsGhostingProc := GetProcAddress(
    GetModuleHandle('user32.dll'),
    'DisableProcessWindowsGhosting');
  if Assigned(DisableProcessWindowsGhostingProc) then begin
    DisableProcessWindowsGhostingProc;
  end;
end;

Karel Horký k tomu píše: Volá se to z Create hlavního okna aplikace.

Celé vlákno: forum.delphi.cz/index.php/topic,16907.msg107189.html#msg107189

Tagy:

trik

Delphi trik 3: ForceQueue

vložil Radek Červinka 30. prosince 2019 21:53

Už dříve jsem psal o TThread.Queue, ale možná jsem nezdůraznil, že v případě volání z hlavního vlákna je takový kód proveden okamžitě, tj. bez volání synchronize, což třeba nejen u Android aplikací může být požadováno.

Pro takový případ je k dispozici TThread.ForceQueue který zaručí, že i v případě volání z hlavního vlákna je takový kód prováděn se synchronizací.

Zkuste si novou aplikaci a na tlačítko Button1.OnClick dejte


procedure TForm6.Button1Click(Sender: TObject);
begin
  TThread.ForceQueue(nil,
     procedure
     begin
       Button1.Caption := 'hello'; // break point 1
       //Button1.Repaint;
     end
    );
end;// break point 2

A nyní program otestujte. Měl by se nejdříve zastavit na break point 2 a pak až na break point 1. Pokud ForceQueue nahradíte za Queue, tak se pořadí zastavení prohodí.

Tagy:

trik

Delphi trik 2: rychlá změna typu komponenty

vložil Radek Červinka 11. prosince 2019 23:29

Sem tam se stane, že je třeba nahradit komponentu za nějakou jinou, např. TEdit za TMemo. Samozřejmě je možno vložit novou komponentu, napasovat pozici, upravit TabOrder, přepojit události atd.

Nebo zobrazit formulář jako text (přes popup menu View as text)

  object Edit1: TEdit
    Left = 192
    Top = 64
    Width = 121
    Height = 21
    TabOrder = 1
    Text = 'Edit1'
  end

Přepsat TEdit na TMemo, přepnout se zpět a IDE zahlásí které property neexistují. Následně při změně pas souboru a jeho uložení IDE zahlásí

Field Form2.Edit1 should be of type Vcl.StdCtrls.TMemo 
but is declared as TEdit. Correct the declaration?

a při Yes se deklarace upraví.

Tagy:

trik

Delphi trik 1: System.Copy, string a 3. parametr

vložil Radek Červinka 4. prosince 2019 19:24

Rozhodl jsem se, že zkusím nějakou sérii malých článků o drobnostech. První bude spíše částečně nedokumentované chování.

System.Copy

function Copy(S: <string or dynamic array>; Index: Integer; Count: Integer): string;

z helpu:

"When S is a dynamic array, you can omit the Index and Count 
parameters and Copy copies the entire array."

takže

var
  s: string;
  s2: string;
begin
  s := 'Hello cool';
  s2 := Copy(s, 3); // <<<<<<<<<< jen 2 parametry
  ShowMessage(s2);

v assembleru Win32

Unit1.pas.32: s2 := Copy(s, 3);
    lea eax,[ebp-$0c]
    push eax
    mov ecx,$7fffffff  <<<< MaxInt
    mov edx,$00000003
    mov eax,[ebp-$08]
    call @UStrCopy

Jako poslední parametr je předán interně MaxInt a Copy vždy kontroluje zda délka odpovídá (můžete si ušetřit počítání zbývajících znaků - v helpu je popsáno, že se kontrola provede, aspoň se neseknete o 1).

Tagy:

trik

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců