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

Aktuelle Zeit: Fr Jul 11, 2025 22:00

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



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 25, 2008 17:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Damit der Thread hier nicht zum erliegen kommt, habe ich ein Text Dokument in mein Wiki eingefügt:
http://www.pluto.lazarusforum.de/dokuwi ... e_projekte
was haltet ihr davon ? Ich finde die Idee eigentlich nicht schlecht und bin auch seit einigen Tagen dabei den Text umzusetzen.
Ich hoffe ich habe alle relevanten Ideen hingeschrieben.
Evlt. kann es auch sein, dass ich das Text Dokument noch Verändern werden. Es ist erst sowas wie eine art Vorlage/Entwurf :D

Meinungen, Verbesserung Vorschläge, Kritik und der gleichen sind wie immer gerne Willkommen.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 27, 2008 10:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich und I0n0s haben in X-Dream dies durch Commandozeichen gelöst.
Word und World of Warcraft machen es genauso.
Man legt ein Steuerzeichen fest, z.B. #BezeichnerNummer(#col=$00ff00) und diese setzen dann die Statemachine.
Also könnte man ein Text z.B. so realisieren.
"Hallo #style=bold#col=$0000FFWorld!"
Worin liegt der Vorteil ?
Ganz einfach, man kann es super parsen und aus dem String entnehmen, wenn man dann bestimmte Befehle nicht kennt einfach ignorieren und man kann die ganz normalen TStringList oder TStrings Komponente benutzen.
Die Statemachine ist nicht mehr als ein record mit allen gewollten Styles und der Parser zerlegt das Rendern dann in mehrere Schritte.
Also setze default Styles, Render Text bis nächsten Steuerzeichen,
parse Steuerzeichen und setzen,
text bis nächsten Steuerzeichen Rendern oder Stringende.
Hier ein Bild.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 27, 2008 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Die Idee ist auch nicht schlecht. Meinen wir mit Steuerzeichen da gleiche ?
ich meine jetzt keine HTML Ähnliche Syntax. Sondern ganz einfach das ich nicht ständig parsen muss. Das möchte ich ungerne tun.
Sieht der User die Steuerzeichen ? Könntest du das Prinzip noch etwas weiter Erklären ? Danke....

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 27, 2008 20:59 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
meinst du sowas wie es hier drin steht:
http://de.wikipedia.org/wiki/Steuerzeichen
Keine schlechte Idee...

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 10:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ja solche Steuerzeichen meine ich, man kann für bold, kursiv,normal, normale steuerzeichen ohne parameter nehmen und für dinge wie Farbe,Schriftart und größe braucht man dann steuerzeichen mit parameter.
Wie man diese aufbaut ist ja völlig schnuppe, es sollte nur einfach parsbar sein.
Ideal sind Anfang und Endzeichen fest zu legen, damit kannst du auch falsche steuerzeichen aus dem Text entfernen.
example:
{blupp}
[bla]
(blupper)
${flubber}
Dann musst du allerdings beachten, dass diese reihenfolge im Text ja auch auftreten kann und um diese darstellen zu können, brauchst du noch ein Steuerzeichen, welches nur das Steuerzeichen darstellt.
example:
${bla}
Text="${bla}${PrintCtrlOpen}Kontrollzeichen}"
danach ist es
Text=="${Kontrollzeichen}"

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 17:17 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Aber wie füge ich solche Zeichen am besten in meinen String ein ?
Und werden sie mit ausgelesen, wenn ich mit Length die Länge eines Strings ermittele ?

z.b. so:
'test' + #1010 + 'test'"
das währe doch jetzt ein Steuerzeichen, heißt das ich müsste mir jetzt eine Funktion schreiben um meine Anweisungen in Steuerzeichen umzuwandeln ?
hast du da evlt. ein kleines Beispiel für mich ? Am besten Steuerzeichen mit Parameter und natürlich welche ohne.
dann könnte ich dazu mal ein kleines Test Projekt aufmachen. Im Moment kann ich mir noch nicht wirklich so vorstellen wie man sie am besten verwenden könnte/sollte bzw. Anwenden.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Du brauchst erstmal einen Parser, der die Steuerzeichen erkennt.
Sehr einfachen Parser Code kannst du durch ein Steuerzeichen mit Anfang und Ende Block schreiben.
${...} ist nun mal unser Steuerzeichen.
Nun brauchst du eine Funktion, in der du dein Text rein gibst, er geparst wird, ein steuerzeichen setz und dann den reslichen text wieder zurück gibt.
Code:
  1. procedure RenderSpecialText(X:integer;Y:integer;TextIn:string)
  2. var
  3.   tmp:string;
  4.   cmdpos,tmpX:integer;
  5. begin
  6.   if (TextIn='') then exit;
  7.   cmdpos=-1;
  8.   //suche erstes ${ und setze cmdpos auf die position
  9.   //kopiere alles von TextIn bis zu cmdpos in tmp
  10.   tmpX=DrawText(tmp).Width;//rückgabe ist ein Record mit Höhe und Breite des gezeichneten Textes und arbeitet mit einer StateMachine die in ExecCmd über FontStateMachine angesprochen wird
  11.   //suche erstes } Zeichen nach cmdpos
  12.   //kopiere zeichenkette von cmdpos+2 bis }-1 in tmp(alles zwischen { und } ohne { und })
  13.   tmpX=ExecCmd(tmp).Width;//führt das Kommando aus
  14.   //kopiere alles ab } in tmp
  15.   RenderSpecialText(X+tmpX,Y,tmp);//rekursiv weiter arbeiten
  16. end;
  17.  
  18. function ExecCmd(var TextIn:string):TRect;
  19. var
  20.   tmp:string;
  21.   tmpX,pos:integer;
  22. begin
  23.   if (TextIn='') then exit;
  24.   //suche = Zeichen oder Zeilenende und setze pos
  25.   //kopiere bis pos alles in tmp
  26.   if (pos=length(TextIn)-1)
  27.   begin
  28.     //Kommando
  29.     //Ideal wäre eine Hashfunktion, die den string in eine Nummer umwandelt
  30.     case Nummer of
  31.       CMD_BOLD:if (uppercase(tmp)='BOLD') then//sicher gehen, das es wirklich das Bold kommando ist, da verschiedene strings auf den gleichen Hashwert fallen können(siehe kollision)
  32.                         begin
  33.                           //Flag für Bold setzen
  34.                         end;
  35.       CMD_CMDSYMBOLBEGIN:if (uppercase(tmp)='CMDSYMBEGIN') then
  36.                                                        begin
  37.                                                          tmpX=DrawText('${').Width;
  38.                                                          result.Width=tmpX;
  39.                                                        end;
  40.     end;
  41.   end
  42.   else
  43.   begin
  44.     //Parameter aufgrund des = im Textes
  45.     //wieder ne Hashfunktion wie bei Kommando
  46.     case Number of
  47.       CMD_SETCOLOR:if (uppercase(tmp)='COLOR')
  48.                                 begin
  49.                                   //kopiere alles ab = bis ende in tmp
  50.                                   //konvertiere string in TColor oder irgendwas vergleichbares
  51.                                   //wenn das nicht möglich ist, dann abbrechen
  52.                                   FontStateMachine.Color:=tmpColor;
  53.                                 end;
  54.   end;
  55. end;


Dieser ${bold}Text${normal} wurde mit dem ${CmdSymBegin}bold${CmdSymEnd}, ${CmdSymBegin}normal${CmdSymEnd},${CmdSymBegin}cmdsymbegin${CmdSymEnd} und ${CmdSymBegin}cmdsymend${CmdSymEnd} Befehlen manipuliert.

Daraus müsste dann "Dieser Text wurde mit dem ${bold}, ${normal},${cmdsymbegin} und ${cmdsymend} Befehlen manipuliert."

Viel mehr will ich dazu dann auch ned mehr schreiben.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Zuletzt geändert von TAK2004 am Do Okt 30, 2008 13:03, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 29, 2008 15:09 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Danke für dein Beispiel. Sehe ich das jetzt richtig:
Das du in diesen Fall einfach nur ein String parst ? Mir ist aber bisher noch unklar wie ich Steuerzeichen hinzufügen.
Ich werde diese Steuerzeichen jetzt so, dass sie vom User nicht gesehen werden und ich als Programmierer diese auch nicht ausfiltern muss. sondern nur FIltern muss damit ich die Richtigen Eigenschaften setzten kann.

edit01
Code:
  1.  
  2. procedure TForm1.BitBtn1Click(Sender: TObject);
  3. var
  4.   x:Integer;
  5. begin
  6.   edit1.text:='Dies ist ein ' + #0'Hallo' + 'test';
  7.  
  8.   for x:=1 to Length(edit1.Text) do begin
  9.     if edit1.text[x] = '#0' then edit2.Text:='OK';
  10.   end;
  11. end;
  12.  

Damit kann ich anscheind einfache Steuerzeichen einfügen Aber wie lese ich sie wieder aus ? mit dem Beispiel wo 'OK' steht geht es aufjedenfall nicht.
Ich habe auch gesehen, das diese Steuerzeichen wirklich nicht angezeigt werden. Das ist Praktisch.

Beim Einlesen einer RTF Datei Beispielweise könnten, jetzt doch einfach die Steuerzeichen gesetzt werden. Allerdings beim Speichern müssen sie ja mit gespeichert werden in der Datei. Passiert das auch "Unsichtbar" vom Normalen User ? Sollte das dann sowas werden wie ein eigenes Dateiformat ? oder werden die Steuerzeichen einfach mit abgespeichert ?
Sonst finde ich die Idee nicht schlecht. Sobald ich das mit dem Auslesen hinbekommen habe, werde ich mal ein Prototypen bauen:

PS:
Eure GUI, sieht nicht schlecht aus. Gerade die Transparent.
Könntest du dein Code bitte in den Code-Tag setzten ?

Edit02
weitere Test ergaben das es doch nicht so geht, das Word wird abgeschnitten wo das Steuerzeichen eingefügt wird.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 17:26 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
ich habe im Moment ein kleines Scroll Problem. Ich habe eine ListBox(aber das gleiche Problem werde ich auch bei meinem nächsten Texteditor Komponente habe).
Und zwar geht es wieder darum, wie scrolle ich per Tastertur.
Ich habe mir folgendes Überlegt:
a) Ich zähle alle Zeilen höhen zusammen
b) solange bis der gewünschte Index erreicht wurde
c) dann setzte ich ViewRect.Top
allerdings klappt das irgendwie nicht. hat jemand eine Idee warum ?
Alle Zeilen können unterschiedlich hoch sein und auch mehrzeilig(später).

Code:
  1.  
  2. procedure TPLLineList.SetViewRecTop(const aItemIndex: Integer);
  3. var
  4.   i,h,h1,h2,y:Integer;
  5. begin
  6.   ViewRect.Top:=0;
  7.   h:=0;y:=0;  h2:=0;
  8.  
  9.   for i:=0 to GetCount-1 do begin
  10.     if i = aItemIndex then begin
  11.       ViewRect.Top:=h2;
  12.       writeln(h2,'',buffer.Height);
  13.       break;
  14.     end
  15.     else begin
  16.       h1:=LineList[i].HighHeight;
  17.       if h+h1 <Buffer.Height then
  18.         h:=h+ViewRect.Top+h1
  19.       else begin
  20.         h2:=h2+h;
  21. //        ViewRect.Bottom:=ViewRect.Top+buffer.Height;
  22.         h:=0;
  23.       end;
  24.     end;
  25.   end; // for i
  26. end; // TPLLineList.SetViewRecTop
  27.  


meine Zeichen Methoden sehen so aus:
Diese Procedure Zeichnet alles und ruft PainteLine auf
Code:
  1.  
  2. procedure TPLLineList.Paint;
  3. var
  4.   i,py,ph,ty:Integer;
  5.   c:TCanvas;
  6. begin
  7.   c:=Buffer.Canvas;
  8.   py:=top;
  9.   with Buffer.Canvas, DefaultTextStyle do begin
  10.     ToCanvas(c);
  11.    // Brush.Color:=clWhite;
  12.     Brush.Style:=bsSolid;
  13.     FillRect(2,0,buffer.Width, buffer.Height);
  14.     ty:=py;
  15.     //BrushStyle:=bsClear;
  16.     FirstLine:=-1; LastLine:=-1;
  17.     for i:=0 to fLineList.Count-1 do begin
  18.       if i = ItemIndex then begin
  19.         SelectItem.ToCanvas(c);
  20.         LineList[i].h:=c.TextHeight('A');
  21.       end
  22.       else
  23.         LineList[i].h:=LineList[i].HighHeight;
  24.  
  25.       ph:=LineList[i].h;
  26.       if (py >=ViewRect.Top) and (py <=ViewRect.Top+ViewRect.Bottom+spaceTop) then begin
  27.         if FirstLine = -1 then FirstLine:=i;
  28.         LineList[i].y:=ty;
  29.         PaintLine(i,True,True);
  30.         ty:=ty+LineList[i].h+spaceTop;
  31.       end;
  32.       if (py >=ViewRect.top+ViewRect.Bottom) and (LastLine= -1) then begin
  33.         LastLine:=i-1;
  34.      //   writelN(LastLine);
  35.       end;
  36.       py:=py+LineList[i].h+spaceTop;
  37.     end;
  38.     if LastLine = -1 then LastLine:=fLineList.Count-1;
  39.     BitBlt(Canvas.Handle,
  40.            0,
  41.            0,
  42.            Width,
  43.            Height,
  44.            Buffer.Canvas.Handle,
  45.            0,
  46.            0,
  47.            SRCCOPY
  48.            );
  49. //    Canvas.Draw(1,1,Buffer);
  50.   end; // wiht
  51. end; // TPLLineList.Paint
  52.  


Code:
  1.  
  2. procedure TPLLineList.PaintLine(const aLineIndex: Integer;const NoNewDraw:Boolean;
  3.                                 const NoDrawCaret: Boolean; const NoSelectedItem:Boolean = False);
  4. var
  5.   x,px,ty,pw,ph,py,w:Integer;
  6.   c:TCanvas;
  7.   LineItem:TPLLineItems;
  8.   r:TRect;
  9.   s, aSel:Boolean;
  10. begin
  11.   c:=Buffer.Canvas;
  12.   px:=left+5; ty:=top;
  13.   with Buffer.Canvas do begin
  14.  
  15.    // s:=((ItemIndex <> aLineIndex) and (not NoSelectedItem)) or (NoSelectedItem);
  16. //    if not s then
  17.       s:=(ItemIndex <> aLineIndex) and (HotItemIndex <> aLineIndex) and (not NoSelectedItem) or (NoSelectedItem);
  18.  
  19.     aSel:=False;
  20.     //writeln('TEST:',ItemIndex,'',aLineIndex,'',NoSelectedItem,'',random(100));
  21.     if not NoSelectedItem then begin
  22.       if (not aSel) and (ItemIndex = aLineIndex) then begin
  23.         aSel:=True;
  24.         SelectItem.ToCanvas(c);
  25.         fHotItemIndex:=-1;
  26.       end
  27.       else begin
  28.         if (not aSel) and (ItemIndex <> HotItemIndex) and (HotItemIndex = aLineIndex) then begin
  29.           aSel:=True;
  30.           HotSelectItem.ToCanvas(c);
  31.         end;
  32.       end;
  33.     end;
  34.  
  35.     if (not aSel) then begin
  36.       DefaultTextStyle.ToCanvas(c);
  37.     end;
  38.  
  39.     ph:=LineList[aLineIndex].h;
  40.     py:=LineList[aLineIndex].y;
  41.     ty:=py;
  42.     FillRect(0,py,buffer.Width, py+ph+spaceTop);
  43.  
  44.     for x:=0 to LineList[aLineIndex].Count-1 do begin
  45.       LineItem:=LineList[aLineIndex].LineItem[x];
  46.       if s then
  47.         LineItem.ToCanvas(c);
  48.       LineItem.w:=c.TextWidth(LineItem.symbol);
  49.       pw:=LineItem.w;
  50.       r.Left:=px;
  51. //      if abs(ph-c.TextHeight(upperCase(LineItem.symbol))) > 10 then
  52.   //      r.Top:=(py+ph)-c.TextHeight(upperCase(LineItem.symbol))
  53.     //  else
  54.         r.Top:=py;
  55.       r.Right:=r.Left+pw+pw;
  56.       r.Bottom:=r.Top+ph+spaceTop;
  57.       if s then Buffer.Canvas.FillRect(r);
  58.  
  59.       SetStyleLine(aLineIndex, r);
  60.       Buffer.Canvas.TextOut(r.Left,r.Top,LineItem.symbol );
  61.       px:=px+pw;
  62.     end; // for x
  63.  
  64.     ph:=LineList[aLineIndex].h+spaceTop;
  65.     py:=LineList[aLineIndex].y;
  66.     px:=left; ty:=top;
  67.  
  68.     if not NoDrawCaret then begin
  69.       BitBlt(Canvas.Handle,0,py,buffer.Width,py+ph,
  70.              buffer.Canvas.Handle,0,py,SRCCOPY
  71.       );
  72.     end;
  73.   end; // with
  74. end; // TPLLineList.PaintLine
  75.  
  76.  

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 09, 2008 21:59 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Ich glaube ich verstehe noch nicht so wie du es meinst.aut wikipedia sollen diese Steuerzeichen nicht da stellbar sein/werden.
Ich muss beim Zeichen alle Steuerzeichen löschen. Aber was ist wenn ich die Länge haben möchte ? oder was einfügen möchte in diesen String ?
oder wenn ich von eine bestimmten stelle bis zu einer anderen bestimmten ALLES kopieren möchte ?

Ich dachte jetzt irgendwie das Steuerzeichen NIE gezeichnet werden. Unter Linux werden sie leider da gestellt. Als unbekanntes Symbol.
Warum weiß ich nicht. Ich weiß auch nicht ob das jetzt richtig ist.

Also, wenn ich dich jetzt richtig verstanden habe, meinst du sowas wie den BB Code hier in den Foren ?
ich habe z.b. folgenden Text:
<fg=clRed> hallo wie</fg> geht es <bg=clLime>dir</bg> so ?
Jetzt würde hallo wie in Rot angezeigt werden und "geht es" in einer Standard Schrift und dir in Grün und so wieder in der Standard schrift Fabre.
Um das richtig da zu stellen, muss ich den Text Parsen und beim zeichnen die "Steuerzeichen" löschen.

Genau das möchte ich eigentlich nicht, weil ich denke, das das bei größeren Texten einfach zu langsam währe und auch von der Handhabung zu Komplex währe. Weil im Moment kann ich mir noch nicht vorstellen, wie der "User" auf den Text einfach zu greifen kann, ohne diese Steuerzeichen zu "sehen".

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.013s | 18 Queries | GZIP : On ]