Weiter gehts mit den Verbesserungsvorschlaegen.
Nochmals zur Erinnerung. Das Hauptfenster ist recht gelungen. Viele kommerzielle Programme sind schlechter designt.
Trotzdem gibt es noch genug zu meckern
Die initiale Beschriftung der Buttons ist falsch. Es muss nicht genannt werden das es ein Button ist, sondern die auszuloesende Aktion muss benannt werden.
Also "Szene 1" bis "Szene 8" und "Effekt 1" bis "Effekt 8". Durch die Trennung der Nummerierung entfaellt auch der falsche Zusammenhang.
es waere noch sehr praktisch wenn die Buttons ein Popupmenue zur individuellen Umbenennung bekommen koennten. Es sollte nicht zum grossen Umbenennungsdialog fuehren, sondern zu einem Dialog mit nur einem Eingabefeld fuehren.
Kommen wir wieder zur Source.
FormCreate:
Der SplashScreen gehoert ins .dpr File. Nur dort kann er vor der Erstellung der MainForm angezeigt werden. Dazu gibt es glaube ich einen Code-Library-Eintrag.
Alles ab "// Statusleiste bereit machen" bis (ausschliesslich) "startfademem := 1;" sind Einstellungen die in der
IDE an den Komponenten gemacht werden sollten.
Das Laden des Konfigurationsfiles gehoert in eine eigene Methode, da es vielleicht auch an anderer Stelle zu gebrauchen ist.
Die folgenden Zuweisungen lassen sich natuerlich mit Komponenten-Arrays entscheidend vereinfachen.
"case data.comport of" ist wiederum ein typischer Fall fuer eine konstante Tabelle.
"// Kanäle 1-32 von Opto Control Deluxe 32 auf 0 setzen" schreit nach einer eigenen Methode "ResetOCDChannels".
"// Alle Toolboxes wie zuletzt gespeichert anordnen" ist ein Kandidat fuer ein Komponenten-Array. Spaetestens wenn es eine Aktion zum Aufraeumen gibt.
"case data.preheatvalue of" wurde ja schon in der vorigen Message behandelt.
"TMainForm.Senddataout" sollte anders organisiert werden. Das zu sendende Datenpaket erst in einem Puffer zusammenstellen und dann in einem comport.senddata senden.
Delphi-Quellcode:
var
Puffer: array [0..15] of Byte;
begin
// alles auf 0 setzen
FillChar(Puffer, SizeOf(Puffer), 0);
// ... die einzelnen Bytes eintragen
// in einem Rutsch senden (auf die verschiedene Laenge pro Firmware achten)
comport.senddata(Puffer, 15);
Der Grund ist, das bei einem USB zu RS232-Adapter das Senden eines einzelnen Bytes 3 ms dauert, ein laengerer Puffer aber nicht mehtr Zeit braucht.
Delphi-Quellcode:
procedure TMainForm.CheckBtns();
var
B: Boolean;
begin
B := listbox.items.count <= 0;
AddBtn.Enabled := B;
AddPMnu.Enabled := B;
RunBtn.enabled := not B;
...
und die Methode schrumpft auf die Haelfte zusammen.
Exit1Click() sollte einfach nur Close audfrufen. Der Dialog wird in den OnCloseQuery-Event der Form verlegt, dann kommt die Abfrage immer egal wie man die Form schliesst.
Es folgen Codewuesteneien, die der Komponenten-Arrays beduerfen.
Bei COMx1Click() hoer ich jetzt mal auf.
Mit dem obigen und besonders mit Komponenten-Arrays duerften noch mehrere Tausend Codezeilen verschwinden, ohne das das Programm irgendetwas verliert.