Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem vykreslení obrázků v poli-velice velké množství

Dobrý den,

Řeším problém s překreslením obrázků v poli.

Na uvod krátký popis problematiky. Jedná se jen o základní popis, nikoliv odborný, učelem je vysvětlení funkce.

Na železnici je spousta typů zabezpečovacího zařízení. To které popisuji se nazývá releové. Je tvořeno panelem s mnoha prvky, nejdůležitější jsou však žárovky a tlačítka, která jsou vidět. Svícení/nesvícení žároviček dává obsluze stanice informace o stavu v kolejišti a podobně. Na panelu je největší množství takzvaných průsvitek. Jsou tvořeny šedou usečkou, za kterou jsou dvě žárovky. Bílá a červená. Existují 3 základní stavy.

Šedá-zařízení v základním stavu, kolej je volná a v pořádku.
Bílá-Přes danou kolej je proveden závěr jízdní cesty. Tzn. pojede tam vlak.
Červená-Daná kolej je obsazena vlakem, nebo je v poruše.

Vedle těchto základních stavů, jsou i další, ale ty nejsou z hlediska dotazu důležité, protože se jedná o kombinace svícení/kmitání žárovek bílá/červená.

To by byl základní popis na pochopení jak to funguje.

Obsluha však potřebuje v případě potřeby znát polohu výhybek. Výhybky jsou tvořeny popsanými průsvitkami, sestavenými do podoby písmene Y. Mají tedy větve a rozlišujeme větve přímé a odbočující. Pokud však na panelu nesvítí průsvitky, neví obsluha do které větve směřuje která výhybka. Aby to bylo obsluze umožněno, má na panelu tlačítko s popisem Kontrola polohy výměn. Po jeho stlačení, dojde k prosvětlení průsvitek bílou barvou (pokud není některá obsazená) a obsluha tak vidí v jaké poloze je ta která výhybka.

Po stlačení se však tyto průsvitky rozsvítí všechny najednou, protože se jedná o sepnutí kontaktu a uzavření okruhu. Ono to není uplně seriové spojení, ale to bych zacházel až moc do detailu.

V jazyku Delphi, mám tedy nakreslený takový panel a jednotlivé průsvitky jsou tvořeny za běhu, jako jednorozměrné pole.

Problém je v tom, že je jich veliké množství, více než 1024, protože ten zdrojový kód je univerzální a není jen jeden panel.

Jde mi o to aby při tomto množství došlo k rozsvícení všech průsvitek najednou.

Zdrojový kod je navržen tak, že projde celé pole (smyčka FOR) a všechny obrázky změní a na konci je zobrazí. Jenže dochází tím prodlevě 1sec až 1,5sec od stlačení tlačítka do zobrazení, což je už moc dlouhá doba a simulátor se pak nechová jako ve skutečnosti.

Věděl by někdo jak upravit algoritmus, tak aby se průsvitky překreslily najednou? Nebo alespon tak rychle že se to bude chovat jako že najednou?

Na formuláři se pak nachází 3 tlačítka, jedno provede vykreslení a 2 zbývající pak překreslení na bílo nebo červeno.Dále 2 editboxy, do kterých se zadává počet řádků a sloupců a 3 obrázky image, které jsou ony průsvitky šedé, bílé a červené.


 
procedure TForm1.btn3Click(Sender: TObject);                                    //kliknutí na tlačítko, přemění všechny na červené a ponechá
begin
  for i:=1 to strtoint(Form1.Caption) do begin                                      //délka smyčky je High(prusvitky), tedy největší index ze všech prvků 
    prusvitky[i].Picture:=img3.Picture;                                                //překreslujeme obrázek, bereme si jej z hotového na formuláři.
  end;
end;


Předem děkuji za případné rady a pomoc.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Je vic možností. Asi bych sáhnul po TStringGrid případně TDrawGrid + pole, kde budeš držet stav. Obr… poslední
Jan Fiala 19.02.2019 08:34
Jan Fiala

Je vic možností.
Asi bych sáhnul po TStringGrid případně TDrawGrid + pole, kde budeš držet stav.
Obrázky bych naházel do TImageList - všechny možnosti, případně základní obrázky + průsvitky, které se budou kreslit následně s průhledným pozadím.
V OnDraw gridu bych obrázek do buňky vykreslil přes ImageList.Draw() - tam zadáš jen kam a index obrázku. V případě, kde bude průsvitka zvlášť vykreslíš základ a přes to ještě jednou jen průsvitku.

Grid ti umožní panel rozdělit na čtverce a poskládat, jak potřebuješ, pak jen potřebuješ držet obsah jednotlivých čtverců.
O vlastní vykreslování se pak starat nebudeš, grid bude vědět, který index má pro buňku použít a jestli tam má navíc nakreslit průsvitku.
Ty jen nastavíš podmínky pro vykreslení - v cyklu nastavíš příznak a zavoláš grid.update

Tvůj současný problém je vytváření obrázků a ještě do nich pak láduješ obrázky - tohle je hodně pomalé.

P.S.
To už je hodně dávno, kdy jsme se učili releové zabezpečovací zařízení, adjustovali kontakty relátek a hledali v úvazech problém...

Zpět do poradny Odpovědět na původní otázku Nahoru