![]() |
Re: OnChange einer Trackbar löst AV aus
Nein, sowas ist es auch nicht. Hier mal der passende Code:
Delphi-Quellcode:
// veg ist eine selbstgeschriebene Klasse und img ist ein TImage.
procedure TFprob.Draw(var Aveg: Tvegenere; start,step,shift: integer; img: Timage);
var w,h: integer; dx: real; lochweite: real; i: integer; x1: integer; max: real; maxh: integer; dy: real; s: real; alist: array[1..26] of real; str: string; j: integer; o: integer; begin w:= img.Width; h:= img.Height; with img.Canvas do begin brush.Style:=bssolid; brush.Color:= clwhite; pen.Color:= clwhite; rectangle(0,0,w,h); pen.Color:=clblack; pen.Width:=2; lochweite := 3; dx:= (w-40-round(26*lochweite) )/26; // Breite der Säulen // Einzeichnen der Verteilung aus dem Text: // Erstellung einer Liste für die Verteilung jedes step.ten Buchstaben // Liste wird gelöscht: for i:=1 to 26 do alist[i]:=0; str:= veg.getcode; i:=start; // Die Liste wird erstellt: while i<=length(str) do begin o:=ord(upcase(str[i]))-ord('A')+1; alist[o]:=alist[o]+1; inc(i,step); end; // Der häufigste Buchstabe wird gesucht: max:=0; for i:=1 to 26 do if alist[i]>max then max:=alist[i]; // Berechnung der Maße der Säulen; try maxh:=h-60; // Höhe der größten Säule dy:= maxh/max; except // Eat this Exception; exit; end; // Säulen werden gezeichnet for i:=1 to 26 do begin pen.Color:=clblack; Brush.Color:=clblack; brush.style:=bsDiagCross; j:= i+shift; if j>26 then dec(j,26); s:= alist[j]*dy; // Höhe der Säule x1:=20+round((i-1)*(dx+lochweite)); rectangle(rect(x1,round(h-(s+30)),round(x1+dx),round(h-30))); str:=chr(j+ord('A')-1); textout(x1+3,h-20,str); end; // Die Säulenhöhe wird für den Normschatten neu errechnet // Der häufigste Buchstabe wird gesucht: max:=0; for i:=1 to 26 do if list[i]>max then max:=list[i]; // Berechnung der Maße der Säulen; try maxh:=h-60; // Höhe der größten Säule dy:= maxh/max; except exit; end; // Normschatten if cbshadow.checked then begin for i:=1 to 26 do begin pen.Width:=3; pen.Color:=clred; brush.Color:=clred; brush.style:=bsHorizontal; // Nur Rahmen s:= list[i]*dy; // Höhe der Säule x1:=20+round((i-1)*(dx+lochweite)); rectangle(rect(x1,round(h-(s+30)),round(x1+dx),round(h-30))); end; end; // of shadow; end; // of image.canvas end; Insgesamt ist der Code Teil ![]() |
Re: OnChange einer Trackbar löst AV aus
Ein Versuch:
Der übergebene Startwert ist 0, Du greifst hier
Delphi-Quellcode:
auf das 0-te Zeichen im String zu, erhältst #0 und damit einen negativen Wert für die Variable o. Der Zugriff auf die Liste aList führt dann zum Absturz.
o:=ord(upcase(str[i]))-ord('A')+1;
alist[o]:=alist[o]+1; Gruß Hawkeye |
Re: OnChange einer Trackbar löst AV aus
Klingt jetzt vllt sehr nach noob :wall: , aber wenn der fehler bei dem end; auftaucht, würde ich einfach mal eins end; dranhängen oder wegnehmen.
Hat bei mir bisher immer geklappt, weil ich irgendwo eins vergessen hatte, wie mir dann aufgefallen ist. :mrgreen: |
Re: OnChange einer Trackbar löst AV aus
Wenn ein end fehlen würde, dann würde bereits beim kompilieren gemeckert ;)
|
Re: OnChange einer Trackbar löst AV aus
In der Funktion selbst kann eigentlich kein Fehler liegen, da ich mir per Showmessage einmal die Parameter angeschaut habe und dann die Draw Funktion im Button mit diesen Parametern aufgerufen habe, wobei es keine Probleme gab. Nur wenn ich die parameter nicht als ''0,1,0' sondern als 'tbshift.position,tbstart.position,...' übergebe, tritt der Fehler auf.
An einem end zu viel kann es auch nicht liegen, da hier nur zwei Befehle aufgerufen werden und keine fies verschachtelte Schleifenkonstruktion vorliegt. |
Re: OnChange einer Trackbar löst AV aus
Hallo,
wenn die Variable start den Wert 0 enthält, kann das zum beschriebenen Fehler führen (siehe meinen Beitrag #12). Gruß Hawkeye |
Re: OnChange einer Trackbar löst AV aus
Die Trackbar hat aber einen Minimalwert von 1. Von da her kann es dieser Fehler nicht sein. Aber vielen Dank für deine Hilfe.
|
Re: OnChange einer Trackbar löst AV aus
Hallo Toxman,
habe mir mal deine Anwendung geladen und ausprobiert. Wenn ich deine auskommentierte draw-Zeile wieder reinnehme, dann habe ich keine Probleme. Ich habe allerdings deine try-except-Blöcke abgeschaltet, indem ich vorher einfach abfrage ob max größer Null ist. Also, wann genau und mit welchen Einstellungen kommt bei dir eine AV? MfG Thorsten PS: Bitte tu dir und dem rest der Welt einen Gefallen -> RÜCKE BITTE DEINEN CODE ORDENTLICH EIN! |
Re: OnChange einer Trackbar löst AV aus
Mit welchem Text hast du es ausprobiert? Ich habe es gerade noch mal mit dem Glocken-Text versucht und habe wieder AVs bekommen.
Zum Reproduzieren: Einfach mal die draw-Befehler im Onchange weglassen und dann die trackbars verschieben, danach auf den Zeichnen-Buton klichen. Bei mir funktioniert es wie ich es mir eigentlich gedacht hatte. Dann zur Abwechslung mal die Draws im Onchange ausführen lassen, und dann im Programm die Trackbars bewegen oder auch nur auf den Schieber klicken. Dann kommen bei mir die AVs. Zitat:
|
Re: OnChange einer Trackbar löst AV aus
Liste der Anhänge anzeigen (Anzahl: 1)
Hai Toxman,
es gehört ja eigentlich nicht zum Thema. Aber ich habe deinen Code mal duch meine (Jedi)Code-Formater gejagt und als Datei angehängt. Imho sollte das dem Borland Styleguide entsprechen. Aber ansonsten sollte darüber in diesem Thread nicht diskutiert werden ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz