[Erl.] fpspreadsheet- find and replace

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

[Erl.] fpspreadsheet- find and replace

Beitrag von af0815 »

Ich versuche gerade das Search&Replace laut der Wiki. Leider laufe ich laufend in einen SIGSEGV in fpspreadsheet.pa line 2344

Code: Alles auswählen

function FindCellWithCode(wb: TsWorkBook; code: string): PCell;
var
  MyRow, MyCol: Cardinal;
  MyWorksheet: TsWorksheet;
  MySearchParams: TsSearchParams;
  MyReplacParams: TsReplaceParams;
begin
  Result := nil;
  MySearchParams.SearchText := code;
  MySearchParams.Options := [soEntireDocument];
  MyReplacParams.ReplaceText:= 'GEFUNDEN';
  MyReplacParams.Options := [roReplaceEntirecell];
  // Create search engine and execute search
  MyRow := 0;
  MyCol := 0;
  with TsSearchEngine.Create(wb) do begin
    ReplaceFirst(MySearchParams, MyReplacParams, MyWorksheet, MyRow, MyCol);
    Free;
  end;
end;
 

Mache ich da was falsch ?

Andreas
Zuletzt geändert von af0815 am So 18. Jun 2017, 08:32, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: fpspreadsheet- find and replace

Beitrag von braunbär »

Sollte MyWorksheet nicht vor dem Aufruf initialisiert werden?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet- find and replace

Beitrag von af0815 »

braunbär hat geschrieben:Sollte MyWorksheet nicht vor dem Aufruf initialisiert werden?

Ist ein out Parameter, wie MyCol, MyRow. WIrd im Prinzip nur aus dem Workbook herausgenommen und sagt im welchem der Sheets die Roc und Col gültig sind. Nein das ist IMHO nicht das Problem.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet- find and replace

Beitrag von wp_xyz »

Wie war das? Globale Variablen werden automatisch genullt, lokale nicht? Dann ist mir ein schlimmer Anfängerfehler unterlaufen: Nachdem der SearchParams-Record in meinen Test-Programmen global war, ist mir nicht aufgefallen, dass im Beispiel-Projekt, auch im Wiki, nicht alle Recordfelder initialisiert sind. Bei dir, Andreas, ist der Searchparams-Record lokal in der Suchroutine deklariert, daher ist das Feld Within mit Blödsinn besetzt...

Wenn du MySearchparams.Within := swWorkbook einfügst, ist der Absturz behoben.

Zur Vereinfachung habe ich in unit fpsutils die Routinen

Code: Alles auswählen

function InitSearchParams(ASearchText: String = ''; 
  AOptions: TsSearchOptions = [];  ASearchWithin: TsSearchWithin = swWorksheet): TsSearchParams;
 
function InitReplaceParams(AReplaceText: String = '';
  AOptions: TsReplaceOptions = []): TsReplaceParams;
bereitgestellt.

Eine Bemerkung noch: Ich weiß ja nicht, wie endgültig die Funktion FindCellWithCode schon ist. Aber auf jeden Fall fehlt der Rückgabewert, wenn die Suche erfolgreich war:

Code: Alles auswählen

  function FindCellWithCode(wb: TsWorkBook; code: string): PCell;
  var
    MyRow, MyCol: Cardinal;
    MyWorksheet: TsWorksheet;
    MySearchParams: TsSearchParams;
    MyReplacParams: TsReplaceParams;
  begin
    Result := nil;
 
    MySearchparams := InitSearchParams(code, [soEntireDocument], swWorkbook);
    MyReplacParams := InitReplaceParams('GEFUNDEN', [roReplaceEntireCell]);
 
    // Create search engine and execute search
    MyRow := 0;
    MyCol := 0;
    with TsSearchEngine.Create(wb) do begin
      if ReplaceFirst(MySearchParams, MyReplacParams, MyWorksheet, MyRow, MyCol) then
        Result := MyWorksheet.FindCell(MyRow, MyCol);
      Free;
    end;
  end;

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet- find and replace

Beitrag von af0815 »

wp_xyz hat geschrieben:Eine Bemerkung noch: Ich weiß ja nicht, wie endgültig die Funktion FindCellWithCode schon ist. Aber auf jeden Fall fehlt der Rückgabewert, wenn die Suche erfolgreich war:

Das ist klar, ich habe nur das wesentliche heraus extrahiert um es als Beispiel zu verwenden.

Langsam sollte ich meine Beispiele zu fpspreadsheet veröffentlich :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten