Toon posts:

[Delphi] Ole Automation error

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ben bezig om met delphi n.a.v. Loggegevens een rapport in word te maken.

Hierbij heb ik een veld Logtekst.. die een widestring bevat. Dit kan een redelijk stuk tekst zijn.
Wanneer ik deze in Word gooi met behulp van de volgende code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function TfrmSpo003.fnWord_StringReplace(_olMsWord: OleVariant; _SearchString: String; _ReplaceString: WideString; _Flags: TWordReplaceFlags): Boolean;
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
begin
  Result := False;
  Try
    _olMsWord.Selection.Find.ClearFormatting;
    _olMsWord.Selection.Find.Text := _SearchString;
    _olMsWord.Selection.Find.Replacement.Text := _ReplaceString;
    _olMsWord.Selection.Find.Forward := True;
    _olMsWord.Selection.Find.Wrap := wdFindContinue;
    _olMsWord.Selection.Find.Format := False;
    _olMsWord.Selection.Find.MatchCase := wrfMatchCase in _Flags;
    _olMsWord.Selection.Find.MatchWholeWord := False;
    _olMsWord.Selection.Find.MatchWildcards := wrfMatchWildcards in _Flags;
    _olMsWord.Selection.Find.MatchSoundsLike := False;
    _olMsWord.Selection.Find.MatchAllWordForms := False;
    // Perform the search
    if wrfReplaceAll in _Flags then
      _olMsWord.Selection.Find.Execute(Replace := wdReplaceAll)
    else
      _olMsWord.Selection.Find.Execute(Replace := wdReplaceOne);

    Result := True;
  except
    Result := False;
    raise;
  end;
end;

// Log Event Log Tekst
            sTekst := dmSpo003.qryCalamiteitLogEvents.FieldByName('LOG_TEKST').value;
            sTekst := StringReplace(sTekst, chr(13) + chr(10), chr(11), [rfReplaceAll]);
            fnWord_StringReplace(olMsWord,'<<:LET_LOGTEKST:>>', sTekst,[]);


krijg ik de error:
code:
1
"String parameter too long"


Hoe kan ik dit oplossen?
Wat is de maximale grootte van Selection.Find.Replacement.Text?

alvast bedankt.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:01

Creepy

Tactical Espionage Splatterer

Op welke regel krijg je die foutmelding? Weet je zeker dat dat de Selection.Find.Replacement.Text is? Wat is de inhoud van de string precies? Want je moet een redelijke replacementstring hebben wil je dat voor elkaar krijgen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Logtekst: (replacestring)
code:
1
2
3
4
5
6
7
8
9
09:12:43 : In uitvoering.
10:18:52 : asfasdf : Ongedaan gemaakt.
10:19:06 : In uitvoering.
10:19:06 : Gebeld met Appel JC op telefoon: 0597-552356
10:19:09 : Persoon Appel JC is binnen.
10:19:10 : Persoon Appel JC vertrekt weer.
10:19:14 : asfasdf : Afgehandeld.
10:19:15 : Afgehandeld.
10:19:27 : test


Regel:
_olMsWord.Selection.Find.Replacement.Text := _ReplaceString;

en de Searchstring = : '<<:LET_LOGTEKST:>>'
Dus ook niet groot.
Krijg ik hem.. Dus niet eens zoveel tekst.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:01

Creepy

Tactical Espionage Splatterer

Maar de replacestring kan dus nog groter worden? Volgens mij kan je beter zoeken op je searchstring, en vervolgens gewoon tekst toevoegen i.p.v. replacen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Probeer eens gebruik te maken van interfaces uit de type library van word (early binding) ipv Variants (late binding). Zie http://www.djpate.freeserve.co.uk/AutoWord.htm

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Maximum Lengte voor Replace is 255 karakters, ook al eens meegemaakt.
Ik heb dat toen als volgt opgelost :
- Splits te vervangen tekst in blokken van bijv. 100 karakters + een unieke string ( bijv @@@ )
- Vervang originele te vervangen tekst met het eerste blok
- Vervang unieke code met het tweede blok.
- wash, rinse, repeat ;) totdat er geen tekst meer is om te vervangen.

Verwijderd

Topicstarter
opgelost op de volgende manier:
Delphi:
1
2
3
4
sTekst := dmSpo003.qryCalamiteitLogEvents.FieldByName('LOG_TEKST').value;
sTekst := StringReplace(sTekst, chr(13) + chr(10), chr(11), [rfReplaceAll]);
fnWord_StringReplace(olMsWord,'<<:LET_LOGTEKST:>>', '',[]);
olMsWord.Selection.TypeText(sTekst);
Pagina: 1