Autor Téma: bezpečnost baličků a doporučení ohledně přejmenování dema  (Přečteno 149 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 422
  • Karma: 0
    • Verze Delphi: 7
Mám dvě nebo tři úplně začátečnické otázky.
První se týká bezpečnosti. Stáhl jsem si nějaké balíčky z http://torry.net/ a dříve zřejmě na doporučení nebo odjinu ještě jiné balíčky. Trochu mě ale zneklidňuje, že některé pochází snad z ruské dílny? Firma Mitov něhem instalace balíčků vytvoří složku LabPacks do Delphi a v tom jsou různá dema práce s avi i konverze (otáčení) obrázků. Dělá do dobrý dojem, ale nemám k tomu zdroje a nevím jestli v tom není nějaký trojský kůň, malware nebo tak něco. Uvažuji teď, že bych raději nainstaloval ještě jeden systém a AVG abych udělal test. Máte s Mitovem zkušenosT? Dále mám staženo SynEdit, to je asi zvýrazňovač syntaxe ještě jsem to nezkoušel, vypadá to že to je na tvorbu editorů - jsou k tomu taky nějaké dema - zatím nevyzkoušeno - AutoCompleteDemo, CompletionProposalDemo, D4Demo, DBSynEditDemo, EditAppDemos, ExportDemo, HighlighterDemo, MultiSynDemo, OnPaintTransientDemo,
pas2html, PrintDemo, PrintDemoNew,
ScanTokensDemo, SearchReplaceDemo,
SimpleIDEDemo, SynAutoCorrectDemo,
URLDemo.

V minulosti jsem instaloval taky JEDI (asi nikdy nepoužil) a pak už jen SimpleXML. Předpokládám, že JEDI je asi VCL rozhraní s podporou Unicode(?) a proto jsem to kdysi instaloval.

Takže dotaz na to jestli máte s něčím z toho negativní zkušenost jako čemu se určitě vyhnout...

Nakonec sem chci ještě nahrát demo (které jsem upravil) od efg2.com. Chystám se udělat nějaké udělátko na výběr obličeje ve fotce (kulatý výběr, případně elipsa, apod.). Jenže tohle demo je brutálně pomalé. Jasně, vím proč. Furt se tam vytváří bitmapa při každé interakci. Ale mě zajímá hlavně, mohli byste se podívat jestli jsem neudělal nějakou chybu při přejmenování souborů? Když otevřu projekt, tak se neotevře formulář ale toto:

Kód: Delphi [Vybrat]
  1. program SelectCirc;
  2.  
  3. uses
  4.   Forms,
  5.   SelectCircle in 'SelectCircle.pas' {SelectCircle};
  6.  
  7. {$R *.RES}
  8.  
  9. begin
  10.   Application.Initialize;
  11.   Application.CreateForm(TSelectCircle, FormSelectCircle);
  12.   Application.Run;
  13. end.

Čili stále mám problém si zapamatovat jak správně postupovat při přejmenovávní projektu, programu, unity, proměnné a ten zbytek.

Poslední otázka, co u TPaintBox znamená slovo invalidate, co se tím myslí a jak to funguje?

A pokud by nebyl seznam otázek dost dlouhý tak mě napadá ještě jedna: dá se to nějak udělat, abych mohl posbírat barvy ve fotce ještě před tím než oblast překreslím kružnicí - třeba do TPainbox? Nějaké ruční (low-level) počítání souřadnic před pythagorovu větu a sbírání jednotlivých pixelů by nejspíš bylo nesmírně pomalé (nicméně nejspíš přijatelně realizovatelné třeba přes scanline & přes pointery).

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3142
  • Karma: 110
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:bezpečnost baličků a doporučení ohledně přejmenování dema
« Odpověď #1 kdy: 21-07-2022, 12:05:36 »
Excellent
Rated 1 time
> co u TPaintBox znamená slovo invalidate, co se tím myslí a jak to funguje?

reknes TPaintBoxu ze chce prekreslit, tj. cilem je ze PaintBox vyvola udalost OnPaint, ve ktere muzes kreslit.

Ad balicky: Mitov, SynEdit, FastReport, Jedi jsou v pohode. Jen Mitov je IMHO dost drahy.
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 422
  • Karma: 0
    • Verze Delphi: 7
Re:bezpečnost baličků a doporučení ohledně přejmenování dema
« Odpověď #2 kdy: 21-07-2022, 17:00:42 »
> co u TPaintBox znamená slovo invalidate, co se tím myslí a jak to funguje?

reknes TPaintBoxu ze chce prekreslit, tj. cilem je ze PaintBox vyvola udalost OnPaint, ve ktere muzes kreslit.

Ad balicky: Mitov, SynEdit, FastReport, Jedi jsou v pohode. Jen Mitov je IMHO dost drahy.

Díky. Úleva  :P . Já myslel že to .invalidate se používá poté co provedu např. vykreslení kružnice. Jako moje myšlenka byla, že chci nejprve zapamatovat ty barvy pixelů, které se překreslí. Takže když potom nakreslím tu kružnici přes fotku, tak (jsem se domníval, že asi) ve třetím kroku to .invalidate tu kružnici zase zruší. Protože anglicky to znamená zrušit nebo vyvrátit, tak jsem myslel, že to snad zruší tu kresbu. Nějaké demo by se mi hodilo. Když hledám na netu tak vyjíždí většinou jen specifické konkrétní otázky na stackoverflow jako třeba "Jak zrušit platnost pouze části paintboxu/bitmapy pro optimalizaci jeho výkonu?" https://stackoverflow.com/questions/25534907/how-to-invalidate-only-part-of-a-paintbox-bitmap-to-optimise-its-performance#25535195.

Kde se píše:

Citace
Otázka se týká: Kreslení na lakovně - Jak bez prodlení držet krok s pohyby myši?

Chystal jsem se v určitém okamžiku položit otázku, jak přemalovat pouze část paintboxu, aniž bych zneplatnil celý paintbox, což je pomalé, když se hodně kreslí nebo v mém případě, když je na něm nakresleno hodně dlaždic. obrazovka.

Z výše uvedeného odkazu se Peter Kostov krátce dotkl tématu v jednom ze svých komentářů:

  bitmapu mimo obrazovku můžete částečně BitBltovat (pouze oblasti, kde je změněna). Tím se dramaticky zlepší výkon.
...
S tím jsem chtěl vědět, jak přesně můžete určit, zda se oblasti bitmapy změnily? Zahrnuje to něco jednoduchého nebo je v určování, které oblasti se změnily, více magie?

Právě teď stále maluji přímo do paintboxu, ale jakmile kreslím do bitmapy offscreen bufferu, mým dalším krokem je optimalizace malby a výše uvedené komentáře zní přesně jako to, co potřebuji, jen mě trochu zmátly určující oblasti, které se změnily.

A v jedné odpovědi se píše:
Citace
Ale v obou případech, když potřebujete zrušit platnost pouze části TPaintBox (část odpovídající části bitmapy mimo obrazovku, na kterou jste nakreslili), můžete použít InvalidateRect()http://msdn.microsoft.com/en-us/library/dd145002.aspx přímo k určení příslušného obdélníku TPaintBox, namísto volání TControl.Invalidate() (které volá InvalidateRect() s parametrem lpRect nastaveným na NULL). Kdykoli je spuštěna událost TPaintBox.OnPaint, InvalidateRect() vytvoří ořezový obdélník na plátně, jakákoli kresba, kterou uděláte mimo tento obdélník, bude ignorována. Pokud chcete ručně optimalizovat svůj výkres nad rámec toho, můžete použít vlastnost TCanvas.ClipRect k určení obdélníku TPaintBox, který je třeba nakreslit, a pouze zkopírovat tuto část z bitmapy na obrazovce.

Jediný problém je, že TPaintBox je potomkem TGraphicControl, takže nemá vlastní HWND, které můžete předat InvalidateRect(). Místo toho byste museli použít jeho Parent.Handle HWND. Což znamená, že byste v případě potřeby museli přeložit relativní souřadnice TPaintBox na relativní souřadnice rodiče a naopak.

V druhé odpovědi se to upřesňuje:
Citace
  • Chcete-li to provést, musíte se ujmout malby:
    Voláním InvalidateRect zrušíte platnost částí okna.
  • Při práci s WM_PAINT zavoláte BeginPaint, což poskytne strukturu malování obsahující obdélník, který se má malovat.


To vše vyžaduje okno a bohužel pro vás není TPaintBox v okně. Takže byste mohli použít ovladač okna rodičovského ovládacího prvku, ale upřímně řečeno by bylo čistší použít ovládací prvek v okně.