Denne lokaliserede version går direkte ind i Defined Names and Cross-Sheet Formulas in Delphi with HotXLS og bruger den opdaterede engelske artikel som teknisk reference for Delphi-, PDF- og dokumentsoftwareteams
Siden omsætter den opdaterede basisartikel til konkrete kontrolpunkter for planlægning, implementering og validering
Hvad der blev synkroniseret fra den engelske artikel
Den engelske basisartikel er blevet udvidet med mere praktisk kontekst, konkrete beslutningspunkter og eksempler, så denne side skal læses som en arbejdsguide frem for en kort oversigt
Vigtige afsnit i den opdaterede basisartikel:
- Brug små reproducerbare inputfiler, før funktionen kobles til produktionsdata
- Hold produktnavne, API-navne, filnavne og literalværdier uændrede
- Gem validatoroutput og versionsoplysninger sammen med den genererede prøvefil
Praktiske valg i implementationen
Start med den konkrete filtype, det ønskede output og den fejltilstand brugeren skal se. Bind derefter hvert API-kald til et kontrollerbart resultat, så validering, logning og support kan gentage kundens scenarie
- Brug små reproducerbare inputfiler, før funktionen kobles til produktionsdata
- Hold produktnavne, API-navne, filnavne og literalværdier uændrede
- Gem validatoroutput og versionsoplysninger sammen med den genererede prøvefil
Kode og API-punkter
Kodeeksemplerne er bevaret uændret, fordi udviklere skal kunne sammenligne dem direkte med Delphi-, C++Builder- og Lazarus/FPC-projekter
var
Book: TXLSXWorkbook;
Data, Summary: TXLSXWorksheet;
begin
Book := TXLSXWorkbook.Create;
try
Data := Book.Sheets.Add('Data');
Summary := Book.Sheets.Add('Summary');
// ... fill Data!A2:D100 with detail rows ...
Book.DefinedNames.Add('TaxRate', '0.08'); // workbook scope, a constant
Book.DefinedNames.Add('DataBlock', 'Data!$A$2:$D$100'); // workbook scope, a range
Book.DefinedNames.Add('LocalNote', 'Summary!$B$1', 1); // scoped to sheet index 1 only
// XLSX formulas take no leading '='
Summary.Cells[2, 2].Formula := 'SUM(Data!D2:D100)*TaxRate';
Book.SaveAs('model.xlsx');
finally
Book.Free;
end;
end;var
Book: IXLSWorkbook; // interface-counted: do not Free
Names: IXLSNames;
begin
Book := TXLSWorkbook.Create;
// assume a sheet named 'Data' already holds the detail rows
Names := Book.GetNames;
Names.Add('TaxRate', '0.08');
Names.Add('Helper', 'Data!$A$2:$A$100', False); // False = hidden from the Name Manager
// XLS formulas go through Value, with the '=' prefix
Book.Sheets[1].Cells.Item[2, 2].Value := '=SUM(Data!A2:A100)*TaxRate';
Book.SaveAs('model.xls');
end;// the calculation engine resolves names and cross-sheet references in-process
V := Book.Calculate('SUM(Data!D2:D100)*TaxRate');
if VarIsNumeric(V) then
Log('net total checks out: ' + FloatToStr(V));Kontrol før udgivelse
Gennemgå outputfilen med samme værktøjer, som kunden eller arkivet bruger. Notér komponentversion, testdata, validatorversion og observeret resultat, så en senere regression kan spores præcist
Supplerende teknisk gennemgang
Denne udvidede sektion knytter an til artiklen Defined Names and Cross-Sheet Formulas in Delphi (HotXLS) på dansk og uddyber den samme arbejdsgang fra et teams perspektiv, hvor beslutninger i generatoren, i valideringen og i den efterfølgende logning skal kunne spores senere. Den engelske kilde på den tilhørende side via hreflang viser, hvorfor det ikke er nok blot at oversætte overskrifterne; pointen er at forklare, hvorfor dokumentet først er færdigt, når regler, output og kontrolspor faktisk hænger sammen
I implementeringsartikler er det nyttigt at skille design fra verifikation. Først fastlægges filtypen, det forventede resultat og den fejltilstand, brugeren skal se, og derefter bindes hvert API-kald til et resultat, der kan afprøves i samme scenarie igen. Det gælder både PDF-arbejdsgange og regnearksfunktioner: kodeeksemplerne forbliver uændrede, men brødteksten skal forklare, hvorfor komponentversion, skabelon-id, inputdata og valideringsstatus bør logges sammen
Det er også vigtigt at bevare produktnavne, API-navne, filnavne og literalværdier præcist som i den engelske kilde. Det holder den fælles reference ramme for udvikling, support og kvalitetssikring og mindsker risikoen for, at den lokale version bare bliver en løs parafrase uden konkret teknisk substans. Hvis artiklen indeholder kode, skal kommentarerne og tokenerne stå urørte, fordi det netop er dem, der forbinder teksten med det virkelige projekt
Når siden læses efter publicering, hjælper det at tænke på den som en del af en sporbar kæde. En god valideringsnote beskriver, hvad der blev testet, hvilket værktøj der vurderede resultatet, hvilke versioner der var involveret, og hvor beviset for et match eller et afslag er gemt. Når en regression opstår senere, er det arkiverede rapportmateriale og den tilhørende inputfil langt mere værd end mindet om, at "det gik dengang"
For denne lokaliserede gren gælder derfor en enkel regel: behold de centrale beslutninger, verifikationspunkterne og kodekonteksten samlet, så artiklen ikke kun kan læses første gang, men også bruges ved senere fejlsøgning, audit og versionssammenligning. Det er forskellen mellem et kort sammendrag og et arbejdsdokument, der stadig har værdi efter flere udgivelser.
- Brug først små reproducerbare inputfiler
- Behold produktnavne, API-navne, filnavne og literalværdier uændrede
- Gem komponentversion, validatorresultat og inputdata sammen
- Bevar kodeblokke og kommentarer præcist som i kilden