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?

Kontrola limitu registrací Delphi

Delphi kontroluje kolikrát bylo instalováno - myslí se tím na nové počítače, nikoliv reinstalace beze změny např. názvu počítače. Tento limit je relativně nízko / přesně nevím/, ale pokud člověk platí maintenanci není problém online požádat o zvýšení. Pokud nemá maintenanci je doporučováno kontaktovat prodejce a domluvit se s ním.

Pokud ale člověk se chystá na nějakou velkou reinstalaci, může požádat o navýšení dopředu pokud si myslí, že už dosáhne limitu.

Nedávno jsem narazil na článek člena MVP Glenn Dufke, který popisuje jak zjistit, kolik registrací ještě máte. Více...

Datum: 2024-09-11 11:03:00 Tagy:

trik

Delphi trik 6: generické anonymní metody

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

Datum: 2020-05-17 21:30:00 Tagy: generics

trik

Delphi trik 5: zrychlení kompilace

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ěší.

Více...

Datum: 2020-03-17 22:18:00 Tagy: delphi

trik

Delphi trik 4: Disable Windows Ghosting

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

Více...

Datum: 2020-03-01 21:34:00 Tagy: VCL

trik

Delphi trik 3: ForceQueue

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

Více...

Datum: 2019-12-30 20:53:00 Tagy: paralel

trik

Delphi trik 2: rychlá změna typu komponenty

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

Více...

Datum: 2019-12-11 22:29:00 Tagy:

trik

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

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

Více...

Datum: 2019-12-04 18:24:00 Tagy:

trik