colorbox oder RGB Farbe benutzen[nicht gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

MAC hat geschrieben:Achja, wie du gemerkt hast ist dein Programm bei select all ziemlich langsam. (zumindestens bei mir)
Das liegt daran, da dein Programm folgendes macht:

Eine Zeile Hinzufügen,
Alles Anzeigen
Eine Zeile Hinzufügen,
Alles Anzeigen
Eine Zeile Hinzufügen,
Alles Anzeigen

und das ziemlich oft, eigentlich reicht folgendes genauso:

Eine Zeile Hinzufügen,
Eine Zeile Hinzufügen,
Eine Zeile Hinzufügen,
Alles Anzeigen

Und das lässt sich ziemlich einfach, aber effizient so machen.

Nehmen wir mal an deine Memo heißt Memo1
dann sieht dein code folgendemaßen auß

Code: Alles auswählen

procedure ...
var
...
begin
Memo1.Lines.Add
Memo1.Lines.Add
...
 
end;
Wenn du den folgender maßen änderst

Code: Alles auswählen

procedure ...
var
...
VMemo:TMemo;
begin
VMemo := TMemo.Create(nil); // erstellt eine VMemo, V für Virtuell ;) heißt aber nur so, ist ne ganz normale memo...
VMemo.Lines.Add // füge die Zeichen zu Vmemo hinzu...
VMemo.Lines.Add
...
Memo1.Text := VMemo.Text; // setzt den Text von Memo1 auf VMemo.text
VMemo.Free; // lscht VMemo wieder, wichtig!...
end;
Wie du siehst, 3 Zeilen mehr Code und wenn das jetzt klappt ist das richtig schnell.
im var berecih machst du eben platzt für eine Weitere Memo.
Die wird dann erstmal erstellt.
Alle befehle beziehen sich auf diese Memo, da diese sich aber nirgens (Frage an die die das wissen, wo befindet die sich eigentlich?) befindet, wird diese auch nicht gezeichnet.
Danach wird der gesammte text auf Memo1 geschrieben, 1 mal zeichnen , und danach wird VMemo gelöscht.
Danke für den sehr guten Tipp :D neue version^^ http://ds.redio.de/lazarus/CanvasCodeMaker%201.3.rar
durchgeführt und siehe da es ist extrem viel schneller geworden.
Eine Frage dazu nochmal, das habe ich noch nie verstanden. was hat dieses 'nil' zu sagen? ich finde das komisch^^

MAC hat geschrieben:Es geht übrigens:
Du makierst in Lazarus alle Checkboxen, gehst in den Objektinspektor und setzt OnMouseDown auf Checkbox1MouseDown
Wenn jetzt strg gerückt wird , wird die globale variable "istSTRG" auf True gesetzt, wenns wieder losgelassen wird auf False.
Das versteh ich noch nicht ganz.
Meinste das in etwa so? Also für jedes Feld abspeichern ob istSTRG true oder false ist und dann am ende die linienart mit ner if abfrage machen?
also meinetwegen if StrgCheckBox1 := true then ... else ___ so in der art und davor wenn man auf den batton klickt ne onklick abfrage if istSTRG := true then StrgCheckBox1 := true else StrgCheckBox1 := false;


Aber achtung , wenn du im MouseDown Checkbox1.Checked := False drückst, dann passiert folgendes:

Checlbox1.Checked wird false gesetzt.
Weil du geklickt hast wird er wieder auf true gesetzt.

Also musst du , das worauf du geklickt hast auf True setzen wenns am ende Auf false sein soll :idea:
Wenn das jetzt nen bisschen kompliziert ist, schreib mal
(Sender as TCheckbox).checked := False;
in Checkbox1MouseDown und du siehst was ich meine, anstatt False ist das ding gecheckt...

Code: Alles auswählen

var
  istSTRG:boolean = False;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if ssCTRL in Shift then istSTRG := True
                   else istSTRG :=False;
end;
[/quote]
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von MAC »

Also, wenn du jetzt ein Button hast und willst das beim Click er was aus führt , kannst du Button1Click erstellen.
Wenn du die gleiche sache auch für button2 machen willst musst du nicht button2Click erstellen, sondern du kannst im objektinspektor "button1click" auswählen.

Du musst also Checkbox1 makieren, OnMouseDown event erstellen und den code kopieren.
Jetzt makierst du alle anderen Checkboxen und wählst da Checkbox1OnMouseDown aus...

das mit dem aber achtung ignorierst du am besten, dafür gibt nähmlich ne einfachere lösung, hab ich gerade gemerkt...

Er speichert also nur in einer Variable , egal ob du beim ersten mal checkbox7 und danach checkbox 134 anklickst...

Dann kannst du Checkbox1Change erstellen und dort schreiben

Code: Alles auswählen

if istSTRG then 
  begin
  //Reihe 1
  end;
in CheckboxChange
if istSTRG then 
  begin
  //Reihe 2
  end;
...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

MAC hat geschrieben:Also, wenn du jetzt ein Button hast und willst das beim Click er was aus führt , kannst du Button1Click erstellen.
Wenn du die gleiche sache auch für button2 machen willst musst du nicht button2Click erstellen, sondern du kannst im objektinspektor "button1click" auswählen.

Du musst also Checkbox1 makieren, OnMouseDown event erstellen und den code kopieren.
Jetzt makierst du alle anderen Checkboxen und wählst da Checkbox1OnMouseDown aus...

das mit dem aber achtung ignorierst du am besten, dafür gibt nähmlich ne einfachere lösung, hab ich gerade gemerkt...

Er speichert also nur in einer Variable , egal ob du beim ersten mal checkbox7 und danach checkbox 134 anklickst...

Dann kannst du Checkbox1Change erstellen und dort schreiben

Code: Alles auswählen

if istSTRG then 
  begin
  //Reihe 1
  end;
in CheckboxChange
if istSTRG then 
  begin
  //Reihe 2
  end;
...
sorry aber wofür ist das jetzt genau da? bin gerade durcheinander

und kennt evtl hier wer nen gutes xml tutorial... hatte überlegt den status der checkboxen da zuspeichern so das man ihn laden kann.
edit: und nen gutes array tutorial wäre auch nciht schlecht
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von MAC »

Das war die antwort auf die frage wie man ganze Zeilen mit strg makiert , oder sollte es zumindest sein ;)
Ach ja, zum nil, ich muss angeben (bei den meinsten) objekten, wer der Vater ist (kein scherz), im englischen "Parent". Ich könnte da Form1,Self (es selbst) , Combobox1, was auch immer angeben. Welche genauen Auswirkungen das in diesem fall hat , keine Ahnung, ich weis nur nil funktioniert :roll:

quatsch, xml tutorial.
Die einfachste lösung, die reicht vollkommen aus, ist ein StringGrid auf die Form zu Zeichnen.
Dann speicherst du den Status, entweder machst du rowcount = 220 und colcount = 1

Code: Alles auswählen

for i := 1 to 220 do 
    begin
     StringGrid1.Cells[0,i] := BooltoStr(....checked);
    end;
StringGrid1.SavetoFile(C:\abc.xml);
Und dann mit LoadfromFile das umgedrehte.
bei ... kommt wieder sowas in der art und den namen rauszubekommen, hast du ja schonmal gemacht...

Code: Alles auswählen

for i := 0 to 220 do
      begin
      VObject := Page1.ControlByName('CheckBox'+inttostr(i));
 
      if VObject = nil then continue;
      if not(VObject is TCheckbox) then continue;
      (VObject as TCheckbox).checked := false; // Geändert, so sollte es eher klammen, VObject wird als TCheckbox behandelt, weil das Object auch eine ist ;)
      end;
Wenn du das so speichern willst , könntest du das sogar in eine Memo, statt in ein StringGrid schreiben, und die speichern...
Was natürlich cooler wäre mich arrays , es auch gleich in ein 2 dimensionales StringGrid zu schreiben, also mit rowcount = 15 und colcount = 15...


Gute Tutorials, auch bestimmt über Arrays http://www.delphi-treff.de/" onclick="window.open(this.href);return false;
http://www.delphi-treff.de/tutorials/ob ... rs/arrays/" onclick="window.open(this.href);return false;

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

aso also das Strg + Klick soll dann einfach die ganze zeile markieren richtig?
ich dachte er speichert das für jedes feld und ich lass wenn mit klick strg gearbeitet wurde die linie stricheln.
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von MAC »

Achso hast du das gemeint, dann ergibt alles einen Sinn.
Meine Idee war nähmlich schlecht (au backe, jetzt hab ich nämlich mit 2 h geschrieben...)
Dann musst du schon für jedes ding einzeln speichern...
Das mit den stricheln ist sinnvoller, nimm einfach ne zusätzliche checkbox für die ganze reihe...

Ich würde dir anbieten:
a) einen Array zu nehmen
oder b) : hier mal oop zu verwenden = du erstellst eine eigene komponente dafür. Frage an die Pro's: ist das sinnvoll, Oder ist das nur sinnvoll weil es halt oop ist ?

Die einfachste mäglichkeit ist sicherlich ein Array [0..220] of TCheckbox und einen Zweiten [0..220] of boolean;

und dann speicherst du im zweiten true wenn mit strg und false wenn ohne strg geklickt wurde...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

MAC hat geschrieben:Achso hast du das gemeint, dann ergibt alles einen Sinn.
Meine Idee war nähmlich schlecht (au backe, jetzt hab ich nämlich mit 2 h geschrieben...)
Dann musst du schon für jedes ding einzeln speichern...
Das mit den stricheln ist sinnvoller, nimm einfach ne zusätzliche checkbox für die ganze reihe...

Ich würde dir anbieten:
a) einen Array zu nehmen
oder b) : hier mal oop zu verwenden = du erstellst eine eigene komponente dafür. Frage an die Pro's: ist das sinnvoll, Oder ist das nur sinnvoll weil es halt oop ist ?

Die einfachste mäglichkeit ist sicherlich ein Array [0..220] of TCheckbox und einen Zweiten [0..220] of boolean;

und dann speicherst du im zweiten true wenn mit strg und false wenn ohne strg geklickt wurde...
das mit den arrays hatte ich vor. da ich in etwa weiß wofür sie sind aber nicht weiß wie sie funktionieren hatte ich auch nach nem link gefargt ;) ich guk mir das nachher ma an und probiers aus ;)
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von MAC »

ganz grobe erklärung eines arrays.
soschwer ist das ganrnicht.
du kannst statt x1,x2,x3,x4,x5:integer;
auch x:array [1..5] of integer; verwenden. Am besten du gewöhnst dich daran bei 0 zu beginnen also x:array [0..4] of integer;
jetzt verwendest du nicht x1 sondern x[1] und x[2].
Vorteil: Schleifen:
for i := 0 to 200 do x := 312;
mehr ist da eigentlich.

Dann gibt es noch mehrdimensionale arrays, also wie z.B: ne excel tabelle. x,y achse zum reinschreiben.
x: array [0..4,0..4] of integer;
x[1,0] := 321;

Oder dynamische Arrays, Bei denen wirds spannend.
Hier ist das ungefähr ein array [0..x] of integer;
es beginnt mit 0, deshalb auch oben das "gewöhn es dir schonmal an"
und die länge kannst du während der laufzeit mit
setlength(x,5) festlegen.
bzw. mit length und high abfragen (length(x) = 5 weil 0 bis 4 5 zahlen sind. high(x) = 4 , weil die letzte benutzbare zahl die 4 ist. high ist schneller).

Für dich reicht das erste. Außer du willst während dem programm einstellen können wieviel Checkboxen zu verwendest...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

yo danke so in etwa wusste ich das schon aber das es so einfach ist hätte ich nicht gedacht ;) nur das mit der 0 ist wie du schon sagtest gewöhnungsbedürftig :D

edit:

Code: Alles auswählen

procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if ssCtrl in Shift then linientyp[0] := 1
                        else linientyp[0] := 0;
end;
den Code oben benutze ich jetzt hast du ja so irgenwo geschrieben kann man auch statt Strg(ssCtrl) z.B. die taste 'd' nehmen?

edit2:
außerdme würde ich das ganze auch gerne in den wuellcode übernehmen.
ich frage immer das hier ab:

Code: Alles auswählen

if linientyp[0] = 1
                      then pen.style := psdot
                      else pen.style := pssolid;
wie kann ich die strich art denn dann in ein solches muster einsetzen?

Code: Alles auswählen

VMemo.Lines.Add(''); // da muss immer wenn linentyp[x] := 1 'pen.style := psdot' und wenn linentyp[x] := 0 'pen.style := pssolid' stehen
Zuletzt geändert von Bauer321 am Mo 8. Nov 2010, 21:50, insgesamt 2-mal geändert.
www.mcpatcher.net | www.hoeper.me

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Teekeks »

Ich sehe gerade:
Weiter oben wird ein Virtuelles Memo erzeugt nur um nicht immer darstellen zu müssen
→ganz böse!!!

Ersetze das:

Code: Alles auswählen

VMemo:TMemo;
begin
VMemo := TMemo.Create(nil); // erstellt eine VMemo, V für Virtuell ;) heißt aber nur so, ist ne ganz normale memo...
VMemo.Lines.Add // füge die Zeichen zu Vmemo hinzu...
VMemo.Lines.Add
...
Memo1.Text := VMemo.Text; // setzt den Text von Memo1 auf VMemo.text
VMemo.Free; // lscht VMemo wieder, wichtig!...
Durch das:

Code: Alles auswählen

Memo1.Lines.BeginUpdate;
//alles hinzufügen...
Memo1.lines.EndUpdate;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

Teekeks hat geschrieben:Ich sehe gerade:
Weiter oben wird ein Virtuelles Memo erzeugt nur um nicht immer darstellen zu müssen
→ganz böse!!!
wieso? also ich möchte nicht nur wissen das es böse ist sondern auch warum...

edit und heißt das dass ich dann immer nur Add(''); schreiben muss da der rest schon bekannt ist?
www.mcpatcher.net | www.hoeper.me

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Teekeks »

Weil du eine Graphische Komponente erzeugst (auch den entsprechenden Ram anforderst usw) an einer stelle wo man einfach nur mit 2 Befehlen das Anzeigen unterbinden kann.

Selbst wenn es anders wäre, sollte man immer noch eine TStringList nehmen, ist auch deutlich weniger Rechenzeit.

Edit:
Immer Memo1.Lines.Add('dein String');

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

Teekeks hat geschrieben:Weil du eine Graphische Komponente erzeugst (auch den entsprechenden Ram anforderst usw) an einer stelle wo man einfach nur mit 2 Befehlen das Anzeigen unterbinden kann.

Selbst wenn es anders wäre, sollte man immer noch eine TStringList nehmen, ist auch deutlich weniger Rechenzeit.

Edit:
Immer Memo1.Lines.Add('dein String');

OK danke werd ich morgen oder so mal übernehmen ;)

und ja also das mit den gestrichelten linien zeichnen hab ich schonmal eingebaut heir neue version : http://ds.redio.de/lazarus/CanvasCodeMaker.rar
das wird aber noch nicht dem generiertem code hinzugefügt


aso und damit das nicht untergeht kopier ich das hier nochmal hin:

edit:

Code: Alles auswählen

procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if ssCtrl in Shift then linientyp[0] := 1
                        else linientyp[0] := 0;
end;
den Code oben benutze ich jetzt hast du ja so irgenwo geschrieben kann man auch statt Strg(ssCtrl) z.B. die taste 'd' nehmen?
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von MAC »

dann musst du beim onkeydown prüfen

if key = 68 then dkick[ Nr von Komponente ] := True

bzw if char(key) = 'd' then ...

68 ist einfach nur der ASCII wert für d...


Danke für BeginUpdate und EndUpdate, hab ich garnicht gewusst das das so einfach geht...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: colorbox oder RGB Farbe benutzen[nicht gelöst]

Beitrag von Bauer321 »

ok danke ich schätze mal ich habe das dann bis heute abend alles übernommen
www.mcpatcher.net | www.hoeper.me

Antworten