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;