Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 01:02

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Nov 23, 2004 21:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Sers!

Ich versuche nun (Nach dem Tutorial von Flo) einmal ein "Memo" zu schreiben.
Allerdings klappt etwas bei der Berechnung für die Cursor Position auf der X Achse net.
Folgenden Code habe ich geschrieben, vllt. schaut ihr mal rein.

Code:
  1. procedure TPhpEditComp.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2. var
  3.   a,b:integer;
  4. begin
  5.   inherited;
  6.  
  7.     For a := 0 To Lines.Count-1 Do
  8.     If (Y > a*(-Canvas.Font.Height+5) ) and (Y < (a+1)*(-Canvas.font.height+5)) then
  9.     begin
  10.       VirtualCursor.Y := a*(-Canvas.Font.Height+5)+5;
  11.       break;
  12.     end;
  13.  
  14.     If a > Lines.Count - 1 then
  15.     exit;
  16.  
  17.     For b := 2 To length(Lines[a]) Do
  18.     If (b = length(Lines[a])) Or ((X > Canvas.TextWidth(copy(Lines[a],1,b-1)) ) and (X <= Canvas.TextWidth(copy(Lines[a],1,b)))) then
  19.     begin
  20.       VirtualCursor.X := Canvas.TextWidth(copy(Lines[a],1,b));//trunc(X / Canvas. ;
  21.       break;
  22.     end;
  23.     if b = 1 then
  24.     VirtualCursor.X := LEFT_BORDER;
  25.   Paint;
  26. end;


Bitte Sehr ;)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 24, 2004 18:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
~->GEF<-~ Adler hat geschrieben:
Code:
  1.  
  2.     For a := 0 To Lines.Count-1 Do
  3.     If (Y > a*(-Canvas.Font.Height+5) ) and (Y < (a+1)*(-Canvas.font.height+5)) then
  4.     begin
  5.       VirtualCursor.Y := a*(-Canvas.Font.Height+5)+5;
  6.       break;
  7.     end;
  8.  


Da die Höhe einer Zeile konstant ist reicht eine einfache Division
z.b
Code:
  1.  
  2.   VCur.Y := ClientHeight div Y;
  3.   if VCur.Y > Lines.Count-1 then VCur.Y := Lines.Count-1;
  4.  


~->GEF<-~ Adler hat geschrieben:
Code:
  1.  
  2.     For b := 2 To length(Lines[a]) Do
  3.     If (b = length(Lines[a])) Or ((X > Canvas.TextWidth(copy(Lines[a],1,b-1)) ) and (X <= Canvas.TextWidth(copy(Lines[a],1,b)))) then
  4.     begin
  5.       VirtualCursor.X := Canvas.TextWidth(copy(Lines[a],1,b));//trunc(X / Canvas. ;
  6.       break;
  7.     end;
  8.     if b = 1 then
  9.     VirtualCursor.X := LEFT_BORDER;
  10.   Paint;
  11. end;
  12.  


Ich habe mir das nochmal überlegt. Ich würde das mit einer solchen Schleife lösen:
Code:
  1.  
  2.  Text := Lines[VCur.Y];
  3.  Max := length(Text);
  4.  Left := 0;// Hochzählender Pixelabstand vom linken rand
  5.  VCur.X := 0; // Variable für Ergebnis
  6.  I:= 1;
  7.  //Annähungs Versuch von Left an X.
  8.  while (I <= Max) and (Left < X) do
  9.  begin
  10.   // Buchstaben für Prüfung vorbereiten  
  11.   {Hier: Font Einstellungen von Buchstaben an Canvas übergeben}
  12.   Left := Left + Canvas.TextWidth(Text[I]);
  13.  
  14.   //Zähler vor nächster Berreichsprüfung erhöhen.
  15.   Inc(I);
  16.  end;  
  17. VCur.X := I-1;
  18.  

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 18:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Code:
  1.   VCur.Y := ClientHeight div Y;
  2.   if VCur.Y > Lines.Count-1 then VCur.Y := Lines.Count-1;


Mh. wie soll das gehen?

CursorPos := Textfeldhöhe dürch momentane Y höhe.

Da bekomme ich doch nicht den richtigen wert raus?! :-/
Hatte es anfangs mit VCur.y := Height div (Canvas.font.textheight + 5) versucht (Allerdings klappte das net) textheight, nur so geschrieben, richtigen befehl vergessen. +5 weil ich immer 5 Abstand zwischen den zeilen habe

Nach dem anderen muss ich mal gucken.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Also der zweite Code ist wirklich Nice!
Allerdings habe ich die Daten für Fett oder nicht nur in Wörtern stehen.
Also jedes Wort hat ne Eigenschaft, nicht jeder Buchstabe.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 25, 2004 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
~->GEF<-~ Adler hat geschrieben:
Code:
  1.   VCur.Y := ClientHeight div Y;
  2.   if VCur.Y > Lines.Count-1 then VCur.Y := Lines.Count-1;

Mh. wie soll das gehen?

Ups! Falsche Werte!
So sollte es gehen:
Code:
  1.   VCur.Y := Y div ZeilenHoehe;
  2.   if VCur.Y > Lines.Count-1 then VCur.Y := Lines.Count-1;

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 25, 2004 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Nice :D
Aber sachste zu X? da ich die Werte nur in "WortBlöcken" habe?!

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]