Autor Beitrag
Stecky2000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Mi 24.06.09 13:48 
Hi allerseits.

Ich habe hier und in anderen Foren (Google) viele Threads zum Thema TRichEdit, RichText und Excel gefunden, aber meist geht es um komplett andere Dinge als ich vorhabe.

Ich verwende unter Delphi7 in eine Anwendung (Dienstplanprogramm), die das Resultat (den Dienstplan) in ein Excel-Sheet (Firmenvorgabe) exportiert. Das ganze läuft über die Funktionalitäten wie

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
excel := CreateOleObject('Excel.Application');
...
Excel.Workbooks.Open(sRootDir + 'Vorlage.xls');
...
Excel.Cells[3329].Value := Edit2.Text;  
...
Excel.Selection.Interior.ColorIndex := 4;  
Excel.Selection.Interior.Pattern := xlSolid;
Excel.Selection.Font.Bold := True;


usw.

Nun gibt es in dem Excel-Formular eine TextBox die ich, wenn ich den Dienstplan nach Excel exportiere, ebenfalls von Delphi aus befüllen will. Das klappt auch teils, mit unformatiertem Text, ggf. noch mit Zeilenumbruch.

Damit ich Texte vorher auch bearbeiten/formatieren kann, hab ich in Delphi ein TRichEdit verwendet dessen Inhalt ich speichern und laden kann. Ich kann dort auch Schrift ändern, färben, Hintergrundfarbe setzen etc.. Das kann man alles in ein File speichern und auch so wieder laden und die Formatierungen sind zu sehen.

Nur, wie kann ich nun den formatierten Text wieder nach Excel in die TextBox schieben, so dass dort auch die Formatierungen zu sehen sind?

Ich hoffe es hat jemand einen Tipp.
Stecky2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Fr 26.06.09 10:45 
Hallo,

weis denn wirklich keiner etwas?

Ich habe mir ja überlegt, da es scheinbar nicht mal innerhalb von Excel funktioniert einen formatierten Text von Textbox1 nach Textbox2 zu kopieren, ob es nicht so in dem Stil laufen könnte:

- Text unformatiert, höchstens mit Zeilenumbruch, in Textbox kopieren
- Textteile markieren
- markierten Textteil formatieren

Die Frage wäre dennoch, wie bekomme ich es hin, die im RichEdit erzeugten RTF-Steuerzeichen so abzufragen, dass ich entsprechende Textteile im Excel markieren kann und formatieren kann?

Na kommt Ihr Fachleute, wer weis was ich machen kann und gibt mir einen Schubs?
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 26.06.09 15:19 
Hallo,

da hilft Dir RichEdit.SelStart, -SelLength, -SelText und -SelAttributes. ...
oder auch RichEdit1.SelAttributes.ConsistentAttributes.
Ist natürlich abhängig von den gesetzten Formaten, Textattribute, Absatzattribute etc.

Du kannst zum einen jedes Zeichen behandeln, z.B.:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for z := 1 to Length(RichEdit.Text) do
    begin
    RichEdit.SelStart := z;
    if fsBold in RichEdit.SelAttributes.Style then
      Memo.Lines.Add('Zeichen: '+RichEdit.Text[z]+' = Style: Bold');
    Memo.Lines.Add('Zeichen: '+RichEdit.Text[z]+
                    ' = Color: '+ColorToString(RichEdit.SelAttributes.Color));
    end;


oder Du prüfst Teile des Textes auf einheitliche Formatierung, z.B.:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
RichEdit.SelStart := 0;
  RichEdit.SelLength := 1;
  while (caBold in RichEdit.SelAttributes.ConsistentAttributes) and
       (caColor in RichEdit.SelAttributes.ConsistentAttributes) and
       (caSize in RichEdit.SelAttributes.ConsistentAttributes) and
       (RichEdit.SelLength < Length(RichEdit.Text)-1do
       begin
       RichEdit.SelLength := RichEdit.SelLength +1;
       end;
  RichEdit.SelLength := RichEdit.SelLength -1;
  showmessage('Alle Zeichen von: '+RichEdit.SelText+#13#10
              +'sind in Fettschrift'+#13#10
              +'Schriftfarbe: '+ColorToString(RichEdit.SelAttributes.Color)+#13#10
              +'Schriftgröße: '+IntToStr(RichEdit.SelAttributes.Size));

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Stecky2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Fr 26.06.09 20:32 
Danke Lannes!

Das muss ich mir erstmal verstehen, werde mich also damit befassen.

Wenn ich dich richtig verstehe, ist die eine Routine um einzelne Zeichen zu bearbeiten,
die andere für Textteile, sprich ganze Wörter oder Sätze.

Wenn das so ist, dann brauche ich ja beides, da ja nie auszuschliessen ist dass man einelene Zeichen oder ganze Wörter/Sätze gemischt in einem Text formatiert.
Stecky2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51



BeitragVerfasst: Sa 27.06.09 17:27 
Hi,

ich habe beide proceduren probiert, habe jedoch bei dieser das Problem, dass sie endlos läuft.
Ich bekomme nicht heraus warum.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
RichEdit.SelStart := 0;  RichEdit.SelLength := 1;  
   while (caBold in RichEdit.SelAttributes.ConsistentAttributes) and       
         (caColor in RichEdit.SelAttributes.ConsistentAttributes) and       
         (caSize in RichEdit.SelAttributes.ConsistentAttributes) and       
         (RichEdit.SelLength < Length(RichEdit.Text)-1do       
          begin
              RichEdit.SelLength := RichEdit.SelLength +1;       
          end;  
         RichEdit.SelLength := RichEdit.SelLength -1;  
         showmessage('Alle Zeichen von: '+RichEdit.SelText+#13#10              
         +'sind in Fettschrift'+#13#10              
         +'Schriftfarbe: '+ColorToString(RichEdit.SelAttributes.Color)+#13#10              
         +'Schriftgröße: '+IntToStr(RichEdit.SelAttributes.Size));


Scheinbar findet er hier
ausblenden Delphi-Quelltext
1:
(RichEdit.SelLength < Length(RichEdit.Text)-1)					

das Ende nicht.

Die andere procedure, als deine erste, funktioniert einwandfrei, berücksichtigt jedoch keinen Zeilenumbruch.
Da werde ich noch ein wenig testen.
Ich würde jedoch gerne erst sehen, was die zweite, die mit der Endlosschleife, für Ergebnisse auswirft.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hat sich erledigt. Endlosschleife wars wohl keine, nachdem ich zu Testzwecken ein Showmessage dazu gebaut habe
gehts auf ein mal. war wohl ein Fehler von mir drin.

Nun gut, ich teste weiter, denn die procedure tut nicht das was ich dachte.

Beispielsweise sagt sie, wenn nur ein unformatierter Text, z.B. 'Hallo' drin steht, dass 'Hallo' komplett in Fetschrift geschrieben wäre.

Wie gesagt, ich teste noch herum um die Funktionsweise zu begreifen und ggf. eine Idee zu bekommen, wie ich sie für die Lösung meines Problems einsetzen könnte.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Sa 27.06.09 19:52 
Hallo,

SelAttributes.ConsistentAttributes funktioniert nur wenn mit SelAttributes der Test formatiert wurde.
Für Text der nicht formatiert wird gilt das Format von DefAttributes(RichEdit.font ...), mit DefAttributes kann ConsistentAttributes nichts anfangen.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )