Net-Base Magasin

14.07.2026

Refaktorisering af legacy-kode i Delphi: risici mindske, vedligeholdbarhed øge, drift sikre

Voksede Delphi-applikationer er ofte forretningskritiske – men hver lille ændring bliver dyrere. Denne artikel viser, hvordan du refaktorerer Legacy-Code i Delphi uden at bringe driften i fare: med klar kortlægning, prioriterede tiltag, tests, data- og...

14.07.2026

Fra magasinets tema til projektpraksis

Passende service- og tekniske sider til artiklen

Video-Botschaft

Refaktorisering af legacy-kode i Delphi: risici mindske, vedligeholdbarhed øge, drift sikre

Kurze Einordnung, warum kontrolliertes Refactoring bei geschäftskritischen Delphi-Systemen Betriebssicherheit und Änderungsfähigkeit verbessert, ohne einen riskanten Rewrite zu starten.

Video mit KI erstellt

Transkript anzeigen

Hallo. Kurz ein Thema, das im Betrieb schnell teuer wird.

Der Beitrag heißt: „Legacy-Code in Delphi refactoren: Risiken senken, Wartbarkeit erhöhen, Betrieb sichern“. Wenn jede kleine Änderung ein potenzieller Ausfall ist, werden Releases langsam, und niemand fasst das System gern an.

Legacy heißt hier nicht nur „alt“. Es heißt: schwer erklärbar, stark verknüpft, und dadurch riskant.

Refactoren bedeutet: umbauen, ohne das Verhalten zu ändern. Also kein Rewrite, sondern ein kontrollierter Umbau am fahrenden System.

Wichtig für Admins und IT-Leitung ist die Reihenfolge: erst Bestandsaufnahme. Was ist geschäftskritisch?

Wo hängen Datenbank, Schnittstellen und Jobs dran? Dann kleine, priorisierte Schritte, abgesichert durch Tests und sauberes Logging, damit Fehler auffallen, bevor Nutzer sie melden.

Wenn Sie dazu Fragen haben, schauen wir es gern gemeinsam an.

Den, der en forretningskritisk Delphi-applikation driver, kender spændingsfeltet: Den kører stabilt, afbilder kerneprocesser og er dybt integreret i databaser, grænseflader og arbejdsgange. Samtidig stiger ændringsomkostningerne og risikoen ved hver Release, fordi kompromiser, undtagelsestilfælde og afhængigheder har samlet sig gennem årene. Netop her tager Legacy-Code in Delphi refactoren fat: ikke som et ‚Rewrite‘-projekt, men som en kontrolleret ombygning på et kørende system – med målbare effekter på vedligeholdbarhed, releasesikkerhed og drift.

I praksis mislykkes refactoring sjældent på Delphi i sig selv, men på manglende transparens: Hvad er fagligt kritisk? Hvor ligger teknisk gæld (dvs. strukturelle mangler, der øger omkostningerne ved senere ændringer)? Hvilke dele kan berøres i vedligeholdelsesvinduer, hvilke ikke? Og hvordan forhindres det, at ‚oprydning‘ skaber nye fejl eller performance-problemer i produktion? Dette indlæg beskriver en praksisorienteret tilgang, der inddrager IT-ledelse og administration: fra statusopgørelse over arkitektur- og dataemner til tests, release-proces og sikkerhedsspørgsmål.

Hvad betyder ‚Legacy‘ i Delphi-projekter egentlig?

‚Legacy‘ sættes ofte lig med ‚gammelt‘. I en virksomhedskontekst er legacy-kode dog primært kode, hvis ændringsrisiko er højt, og hvis adfærd kun delvist kan forklares. Det kan være en VCL-applikation (Visual Component Library, klassisk Windows-desktop-UI), men også en tjeneste, en Scheduler eller et klient-server-system.

Typiske legacy-træk i Delphi-miljøer er:

  • Stærk kobling: UI, datatilgang og forretningslogik er blandet sammen; ændringer medfører sideeffekter.
  • Implicitte Regeln: Domænelogik ligger i Events, globale variabler eller Datenbank-Triggers, ikke i klare moduler.
  • Forældet dataadgang: f.eks. BDE (Borland Database Engine) eller proprietære komponenter; manglende Pooling-/Timeout-strategier.
  • Uensartet fejlbehandling: Exceptions bliver slugt, meddelelser havner ikke i central Logging.
  • Build- og Release-Fragilität: afhængigheder, sti-problemer, forskellige Compiler-Einstellungen, manuelle efterarbejder.
  • Manglende tests: Viden sidder i hoveder eller i den ‚Klickstrecke‘ erfarne brugere følger.

Vigtigt: Legacy-kode er ikke automatisk ‚dårlig‘. Ofte er den et resultat af tidspres, teknologicykler og pragmatiske beslutninger. Refactoring er så en investering i styrbarhed – set fra drift, sikkerhed, compliance og ændringshastighed.

Refactoring vs. Rewrite: Hvad ændrer sig for drift og risiko

Et Rewrite (nyudvikling) lover en ren start, men medfører ofte lange parallelfaser, nye fejlklasser og høje migrationsrisici. Refactoring sigter derimod mod inkrementel forbedring samtidig med kontinuerlig leveringskapacitet. For IT-drift og fagområder er det ofte den afgørende forskel: Systemet forbliver produktivt, og forbedringer leveres i overskuelige pakker.

Praktisk afgrænsning:

  • Refactoring: Strukturen forbedres, den eksterne adfærd skal forblive uændret. Fokus: vedligeholdbarhed, testbarhed, stabilitet, performance-reserver.
  • Restrukturierung/Modernisierung: yderligere målrettede adfærdsændringer, f.eks. nye Schnittstellen, neue Datenbank, neue Plattformziele.
  • Rewrite: ny kodebase, typisk ny UI/Arkitektur; kræver migrering af data, processer, Schnittstellen – ofte „Big Bang“ eller lang overgangsperiode.

For beslutningstagere er punktet centralt: Refactoring er ikke et mål i sig selv, men et løftestang til at reducere forandringsrisici. Det er direkte relevant for driften, når applikationen påvirker 24/7-processer, produktionstunge forløb eller kundevendte portaler.

Legacy-Code in Delphi refaktorere: Start med en pålidelig tilstandsregistrering

Det første skridt er ikke et værktøj, men en fælles opfattelse af risici og mål. Uden denne opfattelse ender refaktorering hurtigt i „wir räumen mal hier auf“ – og netop det er svært at retfærdiggøre i driften.

1) Kritikalität und Betriebsrealität erfassen

Undersøg, hvilke dele der reelt er forretningskritiske: Tagesabschluss, Schnittstellen zu ERP/DMS/CRM, Produktionsdatenerfassung, Abrechnung, Rechteverwaltung. Suppler med driftsparametre: Wartungsfenster, Rollback-Möglichkeiten, Monitoring, Datenvolumen, Latenzanforderungen.

Nyttige kontrolspørgsmål:

  • Hvilke funktioner skal fortsætte med at køre ved delvise nedbrud (degraderingsfunktionalitet)?
  • Hvor er „Single Points of Failure“ (f.eks. en zentral Scheduler)?
  • Hvilke data er regulatorisk eller databeskyttelsesmæssigt følsomme?
  • Hvilke integrationer er mest fejlbehæftede (Datei-Importe, TCP/IP, SOAP/REST, messaging)?

2) Technische Schulden sichtbar machen – nicht nur Code-Style

I Delphi-projekter er teknisk gæld ofte arkitektonisk: globale tilstande, cykliske unit-afhængigheder, svært testbare dataadgange, eller UI-events som „Orchestrierung“. Metriken (f.eks. Komplexität, Unit-Größe, Abhängigkeitsgraph) hjælper, men er kun værdifulde, når de omsættes til konkrete tiltag.

Et praksisvenligt skema er en 2×2-betragtning:

  • Häufig geändert & riskant: højeste prioritet for refaktorering.
  • Häufig geändert & wenig riskant: forbedre Prozesse/Tests, mindre strukturelle tiltag.
  • Selten geändert & riskant: stabilisering/sikring (Tests, Logging), ikke nødvendigvis „schön machen“.
  • Selten geändert & wenig riskant: bevidst lade ligge.

3) Abhängigkeiten inventarisieren: Daten, Schnittstellen, Laufzeit

For administration og projektansvarlige er det afgørende, hvad der ligger uden for koden: Datenbank-Backends, ODBC/OLE DB, Dateifreigaben, Druck- und PDF-Strecken, COM/ActiveX, Office-Automation, Windows-Services, geplante Tasks, Zertifikate, Proxy-Konfigurationen.

Her opstår refactoring-omkostninger ofte indirekte: En „klein“ Änderung kan kræve ny installer-logik, nye rettigheder eller nye firewall-regler. Disse bivirkninger bør tidligt dokumenteres i et teknisk kort.

Typische Problemzonen in Delphi-Legacy und wie man sie gezielt angeht

Refactoring bliver håndterbart, når det målrettes tilbagevendende mønstre. Følgende felter er i praksis ofte de største risiko- og omkostningsfaktorer.

Monolithische Forms: Wenn die UI das System zusammenhält

Mange VCL-applikationer er historisk vokset som „formularstyrede“: Formularen læser data, validerer regler, skriver tilbage, udløser rapporter og opdaterer andre formularer. Det fungerer – indtil flere teams eller flere års ændringshistorik mødes med koden.

En operationelt afprøvet fremgangsmåde er at aflaste UI’et gradvist:

  • Use-case-nære services indføre: faglige operationer som klart navngivne metoder i stedet for event-kæder.
  • Indkapsle dataadgang: forespørgsler/transaktioner ikke i UI-events, men i dataadgangslag.
  • DTO’er/Modeller (enkle dataobjekter) bruge for at adskille formularstatus og databasetilstand.

Målet er ikke „mønster-renhed“, men bedre testbarhed og færre sideeffekter: En ændring i validering eller beregning må ikke bringe hele UI-klikstien i fare.

Modernisere dataadgangen: BDE afløse, FireDAC konsekvent anvende

Hvis BDE eller uensartede datakomponenter stadig er i brug, er refaktorering ofte samtidig en modernisering af driftsrisikoen. BDE er ikke bare gammel, men ofte vanskelig at drive: drivere, konfiguration, 32-bit-afhængigheder og manglende moderne sikkerhedsmekanismer.

BDE-udskiftning med native tilslutning (Delphis moderne dataadgangsbibliotek) er i mange scenarier en fornuftig standard, når der arbejdes konsekvent: ensartede forbindelsesparametre, klare transaktionsgrænser, timeouts, pooling og ordentlig exception-håndtering. Typiske refaktoreringstiltag i dette område:

  • Ensartet forbindelsesstyring: central factory/provider i stedet for „hver formular har sin forbindelse“.
  • Gør transaktioner eksplicitte: Begin/Commit/Rollback som del af use-case, ikke skjult i UI.
  • Parameteriserede forespørgsler konsekvent bruge for at reducere SQL-injection-risici og problemer med specialtegn.
  • Definere timeouts og retries, så netværksproblemer ikke fører til „indfrosne“ formularer.

For IT-drift er det vigtigt, at nye forbindelsesstrategier koordineres med databaseoperationerne (f.eks. maksimale forbindelser, pool-størrelser, deadlock-håndtering, vedligeholdelsesvinduer for schema-ændringer).

Unit-afhængigheder og „globale tilstande“ som hovedårsag til sideeffekter

Delphi-units med store interface-sektioner, mange uses-indgange og globale singletons er typiske acceleranter for sideeffekter. En lille ændring i en unit trækker rebuild-kaskader efter sig eller bryder skjulte initialiseringsrækkefølger.

Pragmatiske skridt, som har vist sig i legacy-projekter:

  • Fastlæg afhængighedsretninger: f.eks. UI → Application Services → Domain/Logik → Data Access → Infrastruktur.
  • Centraliser initialisering: klar startup-sekvens i stedet for unit-initialisering som skjult styring.
  • Reducer globale variabler: hold tilstand i objekter, klarlæg levetid og ejerskab.

Det betaler sig for stabiliteten: Når opstart er deterministisk, er nedbrud efter opdateringer eller konfigurationsændringer lettere at kontrollere.

Trådning og synkronisering: Stabilitet før „Performance-Optimierung“

Mange legacy-applikationer udvikler over tid samtidighed: baggrundsimporter, polling, kommunikation med enheder, parallel behandling. Uden klare regler opstår deadlocks, UI-frysninger eller race conditions (adgangskonflikter ved samtidig udførelse).

For drift og support er det et problem, fordi det ofte skaber „ikke-reproducerbare“ fejl. Refactoring bør her sigte mod standarder:

  • Klar ejerskab for tråde/opgaver og defineret nedlukning (så opdateringer/afslutning ikke hænger).
  • Logning pr. worker med korrelations-id, for at kunne spore forløb.
  • Minimer synkronisation og kapsl UI-adgang stramt (UI-tråd-regel).

Hvis du ønsker at fordybe dig i dette, kan et internt link til et indlæg om robuste mønstre med TThread og Synchronize være nyttigt, fordi emnet ved legacy-refactoring ofte er flaskehalsen for stabilitet.

Arkitekturzielbild: Layering als Werkzeug, nicht als Dogma

Et praktisk mål for mange Delphi-bestandsløsninger er en klar lagstruktur (ofte forstået som „3-lags“): Præsentation (UI), applikationslogik (Use Cases/Services) og dataadgang (Repositories/DAO). Vigtigt er den driftsmæssige vinkel: Layering gør det lettere at teste, opdatere og senere udkoble grænseflader.

Konkrete fordele for virksomheder:

  • Eftermontere grænseflader (f.eks. REST-API), uden at UI-logik skal kopieres.
  • Delmodernisering: Skift af database eller BDE-Ablosung mit nativer Anbindung-omstilling kan centraliseres i ét lag.
  • Vedligeholdelse: Fejl kan indkredses hurtigere, fordi ansvar i koden er klarere.

Et realistisk mål tager højde for, at legacy-systemer sjældent bliver „rene“. Afgørende er, at retningen er rigtig, og at nye ændringer ikke opløser strukturen igen.

Teststrategie für Delphi-Refactoring: Wie Sie Verhalten einfrieren, bevor Sie umbauen

Refactoring uden tests er i forretningskritiske systemer en risiko. Samtidig er fuld testautomatisering ofte ikke realistisk på kort sigt. Det centrale princip er derfor: test målrettet, hvor risiko og ændringstryk er højest.

Golden Master und Regression: Praktisch für Legacy

Et „Golden Master“ er en reference til det aktuelle adfærdsmønster: Input og forventet output fastholdes for at opdage afvigelser efter ændringer. Det er velegnet til rapporter, beregninger, eksporter, import-pipelines eller grænsefladesvar.

Vigtigt for drift: Golden-master-tests reducerer risikoen for, at sideeffekter først viser sig efter rollout — og de understøtter hurtige hotfix-beslutninger, fordi afvigelsen er konkret målbar.

Integrationstests rund um Datenbank und Schnittstellen

Mange fejl opstår ikke i ren forretningslogik, men på systemgrænser: transaktioner, kodning (f.eks. Unicode), tidsstempler, decimalseparatorer, rettigheder, netværksforstyrrelser. Integrationstests bør derfor mindst dække følgende punkter:

  • Transaktionsadfærd ved fejl (rollback, delopdateringer, låsninger).
  • Kodning ved import/eksport (CSV, XML, JSON), især ved specialtegn.
  • Performance-profiler for typiske datamængder, for at opdage gradvise forringelser.

Manuelle Testfälle bleiben – aber strukturiert

Hvor automatisering (endnu) mangler, hjælper strukturerede manuelle testplaner, der er knyttet til releases. Fra administrationssynspunkt er det relevant, at testcases også indeholder driftsperspektiver: installations-/opdateringssti, rettigheder, konfiguration, logging/monitorering, printer/PDF, netværksstier.

Daten und Migration: Refactoring wird oft am Schema entschieden

I Delphi-systemer er databasestrukturer vokset over år. Refaktorering kolliderer ofte med „historiske“ tabeller, dublerede felter eller fagligt overbelastede kolonner. Det kritiske punkt: skemaændringer påvirker drift, Backup/Restore, replikation, rapportering og grænseflader.

Gør skemaændringer planbare

En velafprøvet tilgang er klart versionerede databasemigrationer: Hver ændring af skemaet dokumenteres som et reproducerbart trin, inklusive rollback-strategi. Selv hvis migrationer i første omgang udføres manuelt, er disciplinen afgørende: ingen „vi ændrer lige hurtigt i produktion“.

For release-sikkerhed bør I fastlægge:

  • Nedetidsbehov: Er online-migration mulig, eller kræves et vedligeholdelsesvindue?
  • Tilbageførselsstrategi: datakompatibilitet ved rollback, backups før migration, genopstartplan.
  • Kompatibilitetsfase: applikationen skal kunne arbejde i en overgangsperiode med både gammelt og nyt skema (f.eks. ekstra kolonner, views).

Undervurder ikke datakvalitet og oprydning

En refaktorering afdækker ofte dataproblemer, der tidligere „hang med“: ugyldige værdier, inkonsistenser, manglende fremmednøgler. Her er det vigtigt fagligt at afgøre, hvad der er korrekt. Teknisk bør applikationen fremover validere strengere og logge fejl, så de kan rekonstrueres, i stedet for stille at rette dem.

Eftermonter interfaces uden at destabilisere legacy-systemet

Mange virksomheder refaktorerer Delphi-bestande, fordi nye krav kræver integrationer: portaler, BI, mobile processer, partnerintegrationer. Den hyppigste fejl er at fodre interfaces direkte fra UI-logik eller „et eller andet sted i koden“. Bedre er at placere interfaces i et konsolideret service-lag, som skabes i forbindelse med refaktoreringen.

Når der eftermonteres en REST-API (Representational State Transfer, almindelig web-API over HTTP/JSON), er følgende fra drift- og sikkerhedssynspunkter særligt vigtige:

  • AuthN/AuthZ: adskil autentificering og autorisation klart; f.eks. tokens, SAML 2.0 i forbindelse med virksomhedens SSO, klare rollemodeller.
  • Rate Limits og Timeouts: så eksterne kaldere ikke blokerer backend’en.
  • Versionering: definér API-versioner for at undgå at bryde klienter ved hver ændring.
  • Observability: strukturerede logs, korrelations-id’er, metrikker (fejlrate, latenser).

Et internt link til et uddybende indlæg om eftermontering af en REST-API for bestående software kan her være et godt supplement, fordi interfaces i moderniseringsprojekter sjældent er et „Add-on“, men et selvstændigt driftsprodukt.

Sikkerhed og compliance: Refaktorering som lejlighed til at lukke sikkerhedshuller

Legacy betyder ofte: sikkerhedsantagelser er ældre end nutidens trusselsbillede. Ved refaktorering bør I som minimum tjekke, om systemet skal opdateres på følgende områder:

  • Credentials og Secrets: ingen adgangskoder i INI-filer eller i koden; sikker opbevaring og rotation.
  • Transportkryptering: TLS for grænseflader, ordentlig certifikathåndtering.
  • Least Privilege: databasebrugere og filrettigheder så minimale som muligt; adskilte roller til læsning/skrivning/administration.
  • Auditierbarkeit: nachvollziehbare Änderungen an kritischen Daten (Wer? Was? Wann?), ohne Log-Daten zu Datenschutzproblemen zu machen.
  • Für IT-Leitung ist das ein zentraler Business-Nutzen: Refactoring reduziert nicht nur Wartungskosten, sondern kann Sicherheits- und Audit-Risiken senken, wenn es strukturiert umgesetzt wird.

    Release- und Betriebsprozess: Ohne saubere Pipeline wird Refactoring teuer

    Viele Delphi-Legacy-Projekte leiden weniger am Code als am Prozess: Builds unterscheiden sich je Arbeitsplatz, Releases sind manuell, Fehler lassen sich nicht sauber zurückverfolgen. Refactoring sollte deshalb immer auch den Lieferprozess stabilisieren.

    Build-Reproduzierbarkeit und Konfigurationsmanagement

    Aus Sicht von Administration und Audits ist wichtig, dass ein Release reproduzierbar ist: gleiche Quellen, gleiche Compiler-/Library-Versionen, gleiche Abhängigkeiten. Dazu gehören klar getrennte Konfigurationen für Entwicklung, Test und Produktion (z. B. Datenbankendpunkte, Logging-Level, Feature-Flags).

    Logging, Monitoring und Supportfähigkeit

    „Es ist was passiert“ reicht im Betrieb nicht. Refactoring ist eine gute Gelegenheit, einheitliches Logging einzuziehen: strukturierte Logeinträge, eindeutige Fehlercodes, Kontext (User, Mandant, Auftrag, Schnittstelle) und klare Trennung zwischen technischen Fehlern und fachlichen Validierungen.

    Für 24/7-nahe Prozesse sind zusätzlich sinnvoll:

    • Health Checks (z. B. Datenbankverbindung, Queue-Stau, Speicherverbrauch),
    • Alarmierung nach Schweregrad,
    • Runbooks für Wiederanlauf und typische Störungen.

    Ein praxistauglicher Refactoring-Fahrplan in 6 Schritten

    Damit Refactoring nicht im Tagesgeschäft versandet, hilft ein klarer Fahrplan, der mit Release-Zyklen kompatibel ist. Ein bewährtes Vorgehen:

    1. Risiko- und Änderungslandkarte erstellen (Module, Schnittstellen, Daten, Betrieb).
    2. Schutznetz spannen: Logging-Standard, erste Regression-/Golden-Master-Tests für kritische Pfade.
    3. Architekturtrennlinien einziehen: Service-Schicht und Data-Access-Kapselung als „neue Normalität“ für Änderungen.
    4. Hotspots refactoren: die Module, die häufig geändert werden und Ausfälle verursachen (Fehlerstatistik und Change-Historie nutzen).
    5. Datenzugriff konsolidieren: FireDAC/Transaktionen/Timeouts vereinheitlichen, Performance messen, Deadlocks prüfen.
    6. Modernisierungspfade öffnen: Schnittstellen (REST), Plattformthemen (Unicode/64-Bit), schrittweise UI-Modernisierung, wo sinnvoll.

    Der Kern ist die Reihenfolge: Erst Transparenz und Absicherung, dann Strukturmaßnahmen, dann größere Umbauten. So bleibt die Lösung lieferfähig und betriebsstabil.

    Wann Refactoring nicht reicht: Signale für eine größere Modernisierung

    Es gibt Situationen, in denen reines Refactoring den Engpass nicht auflöst. Typische Signale:

    • Technologische Sackgassen: nicht mehr unterstützte Datenbanktreiber, nicht patchbare Komponenten, harte 32-Bit-Abhängigkeiten.
    • Architektur passt nicht mehr: z. B. die Anwendung muss als Service-Landschaft betrieben werden, aber alles ist UI-zentriert.
    • Skalierung und Verfügbarkeit: Anforderungen an Mandantenfähigkeit, Hochverfügbarkeit oder Remote-Zugriff lassen sich nur mit strukturellen Änderungen erfüllen.
    • Sicherheitsanforderungen: Authentifizierung/SSO, Audit, Verschlüsselung sind nicht nachrüstbar ohne größeren Umbau.

    Selv i disse tilfælde er Refactoring ofte en fornuftig komponent: Det skaber orden, så man kan udskille dele målrettet i stedet for at erstatte hele systemet på én gang.

    Konklusion: Refactoring som teknisk ansvar i den løbende drift

    At refaktorere legacy-kode i Delphi er først og fremmest et spørgsmål om prioritering, risikostyring og operationel nærhed. Hvis I starter med et solidt statusoverblik, sikrer hotspots, konsoliderer dataadgang og arkitekturens adskillelseslinjer og målretter tests samt logging mod kritiske stier, bliver „Aufräumen“ et styrbart moderniseringsforløb. Resultatet er ikke blot mere læsbar kode, men et system, der kan drives mere pålideligt, ændres mere sikkert og integreres lettere.

    Hvis I ønsker at stabilisere eller modernisere jeres Delphi-bestandsløsning struktureret, afklarer vi gerne sammen udgangssituation, risici og en realistisk Refactoring-plan:

    I det faglige miljø spiller også Delphi Modernisierung og Delphi Refactoring en vigtig rolle, når integrationer, dataflows og videreudvikling skal fungere sammen konsistent.

    Drøfte projekt eller moderniseringsforløb med Net-Base.

    Næste skridt

    Når emnet bliver til et reelt projekt, bør arkitektur, eksisterende systemer og drift tidligt betragtes i sammenhæng.

    Vi støtter ikke kun ved enkeltspørsmål, men også når kildekodeudsnit, legacy-komponenter eller portalidéer skal udvikles til et robust virksomhedsprojekt.

    • Eksisterende tilstand, målbillede og tekniske risici vurderes samlet.
    • REST, datatilgang, portaler og udrulning bliver ikke udskudt til senere faser.
    • I ser tidligt, hvilken vej der er økonomisk og operationelt holdbar.

    Del indlæg

    Del dette indlæg direkte

    LinkedIn, X, XING, Facebook, WhatsApp og e-mail er straks tilgængelige. Til Instagram forbereder vi link og kort tekst direkte.

    E-mail

    Instagram åbner i en ny fane. Linket og kortteksten kopieres på forhånd til udklipsholderen.