Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Shape / andere Komponente Blitzen lassen


maheca - Sa 26.03.11 18:08
Titel: Shape / andere Komponente Blitzen lassen
Hallo zusammen!

Ich probiere jetzt schon einige Zeit herum und bin auch ungefähr genauso lang am googeln, leider ohne Erfolg :(
Folgendes Problem: Ich möchte vom PC aus einige Lichteffekte (Blitzer, LED-Fluter etc) steuern. Das ganze funktioniert auch ganz gut, allerdings möchte ich das, was mit den Geräten passiert, auch auf dem Computer darstellen. Dazu habe ich eine sehr einfache Ansicht aus TShapes erstellt, denen ich dann z.B. eine Farbe zuweise. Funktioniert auch super. Problematisch wird es allerdings bei allen Geräten, die blitzen können: Eigentlich sollte das Blitzen von einem Timer aus gesteuert werden, aber leider sind die Blitze mal zu sehen und mal nicht...

Folgender Code im Timer:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TDMXDevMon.LED2Strobe(Sender: TObject);
var
  OutputBuffer: TDMXArray;
  i: Integer;

begin
  OutputBuffer := DMXConnection.getDMX_Out;
  for i := 1 to 8 do begin
    TShape(LED2.Items[i-1]).Brush.Color :=
      round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+Ch_LED2+2])   * $00000001 +
      round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+1+Ch_LED2+2]) * $00000100 +
      round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+2+Ch_LED2+2]) * $00010000;
  end;
  for i := 1 to 15 do begin
    Application.ProcessMessages;
    Sleep(2);   
  end;
  for i := 1 to 8 do begin
    TShape(LED2.Items[i-1]).Brush.Color := $00000000;
  end;
end;


Je früher die einzelnen Shapes erzeugt wurden, desto schlechter werden sie aktualisiert, sprich desto mehr Blitze werden "verschluckt". Ich habe es auch schon mit Invalidate, Repaint, Refresh, Kombinationen von allem versucht --> nichts wird besser. Ich bin echt verzweifelt, das kann doch nicht so schwer sein...
Hat irgendjemand einen Vorschlag, wie ich das ganze verbessern könnte? Bin für jede Hilfe dankbar!


maheca - So 27.03.11 20:49

Hat denn wirklich niemand eine Idee?
(entschuldigt den Doppelpost, aber es ist dringend...)


jaenicke - So 27.03.11 21:02

Hallo und :welcome: im Forum!

Versuche es mit Delay statt Sleep, denn das Problem ist bei Sleep, dass du die Oberfläche einfrierst.
http://www.delphipraxis.net/6620-delay.html

Ja, das Problem warum niemand geantwortet hat könnte sein, dass es ohne Beispiel schlecht nachzuvollziehen ist. ;-)


HenryHux - So 27.03.11 21:04

Hast du mal die Sleep-Time verlängert und geguckt ob er immernoch Aussetzer macht?
Vlt nimmt das Auge ja nicht soviele Blitze auf einmal wahr.

Lg


ALF - So 27.03.11 21:14

Versuche mal dieses:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
OutputBuffer := DMXConnection.getDMX_Out;
for i := 1 to 8 do
begin
    TShape(LED2.Items[i-1]).Brush.Color:= round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+Ch_LED2+2])* $00000001 + 
                                       round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+1+Ch_LED2+2]) * $00000100 +
                                       round(OutputBuffer[Ch_LED2]/250 * OutputBuffer[(i-1)*3+2+Ch_LED2+2]) * $00010000;
    Application.ProcessMessages;
    sleep(2); //<--oder delay
    TShape(LED2.Items[i-1]).Brush.Color := $00000000;
end


Alf