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