vložil Radek Červinka
11. září 2024 12:03
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...
c2215617-d2e7-4202-ae25-da0a3afb9f3d|9|5.0
Tagy:
trik
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...
3380aa1b-277f-48f8-b2f0-56680e49303c|6|5.0
Tagy: generics
trik
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í.
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ěší.
8db0f460-e429-407e-a156-13bd3c73492a|4|5.0
Tagy: delphi
trik
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
b6a6a839-0272-407d-9be9-3ece0c3ce087|5|5.0
Tagy: VCL
trik
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í.
2598552f-6b4d-4c65-a3d7-43cb704a6412|9|5.0
Tagy: paralel
trik
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í.
574fc410-4cf2-48e3-84a2-cdd3504aee24|7|5.0
Tagy:
trik
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).
eabe847d-c68d-4901-abc9-b04d45654956|10|5.0
Tagy:
trik