Net-Base Magasin

14.07.2026

Refaktorering av legacykode i Delphi: redusere risiko, øke vedlikeholdbarhet, sikre drift

Etablerte Delphi-applikasjoner er ofte forretningskritiske – men hver lille endring blir dyrere. Denne artikkelen viser hvordan du kan refaktorere Legacy-kode i Delphi uten å sette driften i fare: med tydelig tilstandskartlegging, prioriterte tiltak, tester, data- og...

14.07.2026

Fra magasinetema til prosjektpraksis

Egnede tjeneste- og tekniske sider for innlegget

Video-Botschaft

Refaktorering av legacykode i Delphi: redusere risiko, øke vedlikeholdbarhet, sikre drift

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 som driver en forretningskritisk Delphi-applikasjon kjenner dilemmaet: Den kjører stabilt, speiler kjerneprosessene og er dypt integrert i databaser, grensesnitt og arbeidsflyter. Samtidig øker endringsinnsats og risiko for hvert release, fordi kompromisser, spesialtilfeller og avhengigheter har hopet seg opp over år. Her tar Legacy-Code in Delphi refactoren tak: ikke som et «Rewrite»-prosjekt, men som en kontrollert ombygging på et system i drift – med målbare effekter på vedlikeholdbarhet, release-sikkerhet og drift.

I praksis mislykkes refaktorering sjelden på grunn av Delphi selv, men på grunn av manglende transparens: Hva er faglig kritisk? Hvor ligger teknisk gjeld (altså strukturelle mangler som gjør senere endringer dyrere)? Hvilke deler kan berøres i vedlikeholdsvinduer, hvilke ikke? Og hvordan hindrer man at «rydding» introduserer nye feil eller ytelsesproblemer i produksjon? Denne artikkelen beskriver en praktikabel tilnærming som tar med IT-ledelse og administrasjon: fra kartlegging via arkitektur- og dataspørsmål til tester, releaseprosess og sikkerhetsspørsmål.

Hva betyr «Legacy» i Delphi-prosjekter egentlig?

«Legacy» blir ofte likestilt med «gammel». I bedriftskontekst er legacy-kode imidlertid først og fremst kode hvor endringsrisikoen er høy og oppførselen bare delvis forståelig. Det kan være en VCL-applikasjon (Visual Component Library, klassisk Windows-desktop-UI), men også en tjeneste, en scheduler eller et klient-server-system.

Typiske legacy-kjennetegn i Delphi-miljøer er:

  • Sterk kobling: UI, dataaksess og forretningslogikk er blandet; endringer medfører sideeffekter.
  • Implisitte regler: Faglogikk ligger i hendelser, globale variabler eller database-triggere, ikke i klare moduler.
  • Utdaterte dataaksesser: f.eks. BDE (Borland Database Engine) eller proprietære komponenter; manglende pooling-/timeout-strategier.
  • Uensartet feilhåndtering: Exceptions blir svelget, meldinger havner ikke i sentral logging.
  • Build- og release-fragilitet: Avhengigheter, baneproblemer, ulike compiler-innstillinger, manuelt etterarbeid.
  • Manglende tester: Kunnskap sitter i hodene eller i «klikkstien» til erfarne brukere.

Viktig: legacy-kode er ikke automatisk «dårlig». Ofte er det resultat av tidspress, teknologisykluser og pragmatiske beslutninger. Refaktorering er da en investering i håndterbarhet – fra driftens, sikkerhetens, compliance- og endringshastighets perspektiv.

Refaktorering vs. Rewrite: Hva endrer seg for drift og risiko

Et Rewrite (nyutvikling) lover en ren start, men medfører ofte lange parallelle faser, nye feiltyper og høye migrasjonsrisikoer. Refaktorering derimot sikter mot inkrementell forbedring samtidig som kontinuerlig leveranseevne opprettholdes. For IT-drift og fagavdelinger er dette ofte avgjørende: Systemet forblir produktivt, og forbedringer leveres i oversiktlige pakker.

Praktisk avgrensning:

  • Refaktorering: Strukturen forbedres, systemets eksterne oppførsel skal være uendret. Fokus: vedlikeholdbarhet, testbarhet, stabilitet, ytelsesreserver.
  • Restrukturering/modernisering: i tillegg målrettede endringer i oppførsel, f.eks. nye grensesnitt, ny database, nye plattformmål.
  • Omskriving: ny kodebase, som regel ny UI/arkitektur; krever migrering av data, prosesser, grensesnitt – ofte «Big Bang» eller lang overgangsfase.

For beslutningstakere er punktet sentralt: Refaktorering er ikke et selvformål, men et virkemiddel for å redusere endringsrisikoer. Det er umiddelbart driftsrelevant når applikasjonen påvirker 24/7-prosesser, produksjonsnære arbeidsflyter eller kundevendte portaler.

Refaktorering av Legacy-kode i Delphi: Start med en pålitelig bestandsopptak

Det første trinnet er ikke et verktøy, men en felles oppfatning av risikoer og mål. Uten denne oppfatningen ender refaktorering raskt i «vi rydder litt her» – og nettopp det er vanskelig å rettferdiggjøre i drift.

1) Kartlegg kritikalitet og driftsrealitet

Kartlegg hvilke deler som virkelig er forretningskritiske: dagsavslutning, grensesnitt til ERP/DMS/CRM, produksjonsdatafangst, fakturering, rettighetsstyring. Legg til driftsparametre: vedlikeholdsvinduer, rollback-muligheter, overvåking, datavolum, latenskrav.

Nyttige kontrollspørsmål:

  • Hvilke funksjoner må fortsatt kjøre ved delvise feil (degraderingsevne)?
  • Hvor finnes enkeltfeilpunkter (f.eks. en sentral scheduler)?
  • Hvilke data er regulatorisk eller personvernmessig sensitive?
  • Hvilke integrasjoner er mest feilsårbare (filimporter, TCP/IP, SOAP/REST, meldingssystemer)?

2) Gjør teknisk gjeld synlig – ikke bare kode-stil

I Delphi-prosjekter er teknisk gjeld ofte arkitektonisk: globale tilstander, sykliske enhetsavhengigheter, vanskelig testbare dataaksesser, eller UI-hendelser brukt som «orkestrering». Metrikker (f.eks. kompleksitet, enhetsstørrelse, avhengighetsgraf) er nyttige, men bare verdifulle hvis de omsettes til tiltak.

Et praktisk rammeverk er en 2×2-vurdering:

  • Ofte endret & risikabelt: høyeste prioritet for refaktorering.
  • Ofte endret & lite risikabelt: forbedre prosesser/tester, mindre strukturelle tiltak.
  • Sjelden endret & risikabelt: stabilisering/sikring (tester, logging), ikke nødvendigvis «gjøre det pent».
  • Sjelden endret & lite risikabelt: la ligge bevisst.

3) Inventariser avhengigheter: data, grensesnitt, kjøretid

For drift og prosjektansvarlige er det avgjørende hva som henger utenfor koden: database-backends, ODBC/OLE DB, fildelinger, utskrift- og PDF-pipelines, COM/ActiveX, Office-automatisering, Windows-services, planlagte oppgaver, sertifikater, proxy-konfigurasjoner.

Her oppstår refaktoringskostnader ofte indirekte: en «liten» endring kan pålegge ny installerlogikk, nye rettigheter eller nye brannmurregler. Disse sideeffektene bør tidlig dokumenteres i et teknisk veikart.

Typiske problemsoner i Delphi-legacy og hvordan man tar tak i dem målrettet

Refaktorering blir håndterlig når den retter seg mot mønstre som gjentar seg. Følgende områder er i praksis ofte de største risiko- og kostnadsdriverne.

Monolittiske Forms: Når UI holder systemet sammen

Mange VCL-applikasjoner har historisk vokst frem som «form-drevet»: Skjemaet laster data, sjekker regler, skriver tilbake, utløser rapporter og oppdaterer andre skjermer. Det fungerer – helt til flere team eller flere års endringshistorikk møter det.

Et operativt bevist tiltak er å avlaste UI trinnvis:

  • Use-Case-nære Services innføre: faglige operasjoner som klart navngitte metoder i stedet for event-kjeder.
  • Kapsle datatilgang: queries/transaksjoner ikke i UI-events, men i Data-Access-lag.
  • DTOs/Modelle (enkle dataobjekter) bruke for å skille mellom skjema-tilstand og database-tilstand.

Målet er ikke «pattern-renhet», men bedre testbarhet og færre sideeffekter: En endring i validering eller beregning skal ikke sette hele UI-klikkforløpet i fare.

Modernisere datatilgang: BDE erstatte, FireDAC konsekvent bruke

Hvis fortsatt BDE eller uensartede datakomponenter er i bruk, er refaktorering ofte samtidig en modernisering av driftsrisikoen. BDE er ikke bare gammel, men ofte vanskelig å drifte: drivere, konfigurasjon, 32-bit-avhengigheter og manglende moderne sikkerhetsmekanismer.

BDE-erstatning med native tilkobling (Delphis moderne Datenzugriffsbibliothek) er i mange scenarier en fornuftig standard når det arbeides konsekvent: enhetlige tilkoblingsparametre, klare transaksjonsgrenser, timeouts, pooling og ren unntakshåndtering. Typiske refaktoreringstiltak i dette området:

  • Standardisere tilkoblingshåndtering: sentral Factory/Provider i stedet for «hvert skjema har sin connection».
  • Gjør transaksjoner eksplisitte: Begin/Commit/Rollback som del av use-casen, ikke skjult i UI.
  • Bruk parameteriserte Queries konsekvent for å redusere SQL-injeksjonsrisiko og problemer med spesialtegn.
  • Definer Timeouts og Retries, slik at heng i nettverket ikke fører til «frosne» skjermer.

For IT-drift er det viktig at nye Connection-strategier koordineres med databaseoperasjonen (f.eks. maksimale forbindelser, pool-størrelser, Deadlock-Handling, vedlikeholdsvinduer for skjemaendringer).

Unit-avhengigheter og «globale Zustände» som hovedårsak til sideeffekter

Delphi-Units med store Interface-seksjoner, mange Uses-oppføringer og globale Singletons er typiske akseleratorer for sideeffekter. En liten endring i en Unit utløser Rebuild-Kaskaden eller bryter skjulte Initialisierungsreihenfolgen.

Pragmatiske tiltak som har bevist seg i legacy-prosjekter:

  • Fastsette avhengighetsretninger: f.eks. UI → Application Services → Domain/Logikk → Data Access → Infrastruktur.
  • Sentralisere initialisering: klar Startup-Sequenz i stedet for Unit-Initialization som skjult kontroll.
  • Redusere globale variabler: hold tilstand i objekter, avklar levetid og eierskap.

Det bidrar til stabilitet: Når oppstarten er deterministisk, er feil etter oppdateringer eller konfigurasjonsendringer lettere å håndtere.

Tråding og synkronisering: stabilitet fremfor «Performance-Optimierung»

Mange legacy-applikasjoner blir over tid samtidige: bakgrunnsimporter, polling, kommunikasjon med enheter, parallell behandling. Uten klare regler oppstår deadlocks, UI-heng eller race conditions (tilgangskonflikter ved samtidig utførelse).

For drift og support er dette et problem, fordi det ofte skaper «ikke-reproduserbare» feil. Refaktorering bør her sikte mot standarder:

  • Klart eierskap for tråder/tasks og definert avstenging (slik at oppdateringer/avslutning ikke henger).
  • Logging per worker med korrelasjons-ID for å kunne spore forløp.
  • Minimer synkronisering og kapsle UI-tilgang strengt (UI-trådregelen).

Hvis du ønsker å fordype deg i dette, kan det være fornuftig å plassere en intern lenke til et innlegg om robuste mønstre med TThread og Synchronize, fordi dette temaet ved legacy-refaktorering ofte er flaskehalsen for stabilitet.

Architekturzielbild: Layering als Werkzeug, nicht als Dogma

Et praktisk mål­bilde for mange Delphi-bestandsløsninger er en klar lagstruktur (ofte forstått som «3-lags»): presentasjon (UI), forretningslogikk (use cases/tjenester) og dataadgang (repositories/DAO). Viktig er den driftsmessige perspektiven: lagdeling forenkler tester, oppdateringer og senere utskilling av grensesnitt.

Konkrete fordeler for virksomheter:

  • Legge til grensesnitt i etterkant (f.eks. REST-API), uten at UI-logikk må kopieres.
  • Delvis modernisering: databasebytte eller BDE-Ablosung mit nativer Anbindung-overgang kan samles i ett lag.
  • Vedlikehold: Feil kan avgrenses raskere, fordi ansvarsområdene i koden er tydeligere.

Et realistisk målbildet tar høyde for at legacy-systemer sjelden blir «rene». Avgjørende er at retningen er riktig og at nye endringer ikke gjør strukturen uklar igjen.

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

Refaktorering uten tester er i forretningskritiske systemer en risiko. Samtidig er full testautomatisering ofte ikke realistisk på kort sikt. Hovedtanken er derfor: teste målrettet der risiko og endringspress er høyt.

Golden Master und Regression: Praktisch für Legacy

En «Golden Master» er en referanse for nåværende oppførsel: input og forventet output registreres for å oppdage avvik etter endringer. Det passer for rapporter, beregninger, eksport, import-pipelines eller grensesnittsresponser.

Viktig for drift: Golden-master-tester reduserer risikoen for at bivirkninger først oppdages etter utrulling — og de støtter raske hotfix-beslutninger fordi avvikene kan måles konkret.

Integrationstests rund um Datenbank und Schnittstellen

Mange feil oppstår ikke i ren forretningslogikk, men ved systemgrensene: transaksjoner, tegnsett (f.eks. Unicode), tidsstempler, desimalskille, rettigheter, nettverksforstyrrelser. Integrasjonstester bør derfor minst dekke følgende punkter:

  • Transaksjonsatferd ved feil (rollback, deloppdateringer, låsing).
  • Tegnsett/encoding ved import/eksport (CSV, XML, JSON), særlig ved spesialtegn.
  • Ytelsesprofiler for typiske datamengder, for å avdekke gradvise forverringer.

Manuelle Testfälle bleiben – aber strukturiert

Dersom automatisering (ennå) mangler, hjelper strukturerte manuelle testplaner som er knyttet til releaser. Fra administrasjonens ståsted er det relevant at testtilfellene også inkluderer driftsaspekter: installasjons-/oppdateringssti, rettigheter, konfigurasjon, logging/monitorering, skriver/PDF, nettverksstier.

Daten und Migration: Refactoring wird oft am Schema entschieden

I Delphi-systemer har databasestrukturer vokst over år. Refaktorisering kolliderer ofte med „historiske“ tabeller, dupliserte felt eller faglig overfylte kolonner. Det kritiske punktet: endringer i skjemaet påvirker drift, backup/restore, replikasjon, rapportering og grensesnitt.

Gjør skjemaendringer planbare

En velprøvd tilnærming er klare, versjonerte databasemigrasjoner: hver endring i skjemaet dokumenteres som et reproduserbart trinn, inkludert tilbake­rullingsstrategi. Selv om migrasjoner i utgangspunktet utføres manuelt, er disiplinen avgjørende: ingen „vi endrer raskt i produksjon“.

For release-sikkerhet bør dere fastsette:

  • Nedetidsbehov: Er online-migrasjon mulig, eller er vedlikeholdsvindu nødvendig?
  • Tilbakerullingsstrategi: Datakompatibilitet ved rollback, backuper før migrasjon, plan for gjenoppstart.
  • Kompatibilitetsfase: Applikasjonen kan i en overgangsperiode fungere mot både gammelt og nytt skjema (f.eks. ekstra kolonner, visninger).

Ikke undervurder datakvalitet og opprydding

En refaktorisering avdekker ofte dataproblemer som tidligere „svevde med“: ugyldige verdier, inkonsistenser, manglende fremmednøkler. Her er det viktig å fatte faglige beslutninger om hva som er korrekt. Teknisk bør applikasjonen fremover validere strengere og loggføre feil etterprøvbart, i stedet for å korrigere dem i det skjulte.

Ettermontere grensesnitt uten å destabilisere legacy-systemet

Mange selskaper refaktorerer Delphi-installasjoner fordi nye krav krever integrasjoner: portaler, BI, mobile prosesser, partnerkoblinger. Den vanligste feilen er å mate grensesnitt direkte fra UI-logikk eller „et eller annet sted i koden“. Bedre er å plassere grensesnittene i et konsolidert servicesjikt som allerede etableres under refaktoriseringen.

Når en REST-API (Representational State Transfer, vanlig web-API over HTTP/JSON) ettermonteres, er følgende fra drifts- og sikkerhetssyn særlig viktige:

  • AuthN/AuthZ: Autentisering og autorisering bør skilles klart; f.eks. tokens, SAML 2.0 i sammenheng med bedriftens SSO, og tydelige rollemodeller.
  • Rate Limits und Timeouts: for å hindre at eksterne kall blokkerer backend.
  • Versionierung: Definer API-versjoner for å unngå å bryte klienter ved hver endring.
  • Observability: strukturert logging, korrelasjons-IDer, metrikker (feilrater, latenser).

En intern lenke til et utdypende innlegg om ettermontering av en REST-API for eksisterende programvare kan her passe godt, fordi grensesnitt i moderniseringsprosjekter sjelden er et „Add-on“, men et eget driftsprodukt.

Sikkerhet og compliance: Refaktorisering som anledning til å lukke sikkerhetshull

Legacy betyr ofte: sikkerhetsantagelser er eldre enn dagens trusselbilde. Ved refaktorisering bør dere minst vurdere om systemet må oppdateres på følgende områder:

  • Credentials und Secrets: ingen passord i INI-filer eller i koden; sikker lagring og rotasjon.
  • Transportverschlüsselung: TLS for grensesnitt, ryddig sertifikatshåndtering.
  • Least Privilege: Databasebrukere og filrettigheter så minimale som mulig; separate roller for lesing/skriving/administrasjon.
  • Reviderbarhet: sporbare endringer i kritiske data (Hvem? Hva? Når?), uten at loggdata skaper personvernproblemer.
  • For IT-ledelsen er dette en sentral forretningsgevinst: refaktorering reduserer ikke bare vedlikeholdskostnader, men kan også redusere sikkerhets- og revisjonsrisiko hvis det gjennomføres strukturert.

    Release- og driftsprosess: Uten en ren pipeline blir refaktorering dyrt

    Mange Delphi-Legacy-prosjekter lider mindre av koden enn av prosessen: builds varierer mellom arbeidsplasser, releaser gjøres manuelt, feil kan ikke spores tydelig. Refaktorering bør derfor også stabilisere leveranseprosessen.

    Build-reproduserbarhet og konfigurasjonsstyring

    Fra administrasjonens og revisjoners perspektiv er det viktig at en release er reproduserbar: samme kilder, samme compiler-/bibliotekversjoner, samme avhengigheter. Dette inkluderer klart adskilte konfigurasjoner for utvikling, test og produksjon (f.eks. databaseendepunkter, loggnivå, feature-flags).

    Logging, overvåking og supportevne

    „Det har skjedd noe“ er ikke nok i drift. Refaktorering er en god anledning til å innføre enhetlig logging: strukturerte loggoppføringer, entydige feilkoder, kontekst (bruker, mandant, oppdrag, grensesnitt) og klar separasjon mellom tekniske feil og faglige valideringer.

    For 24/7-nære prosesser er det i tillegg nyttig:

    • Helsetjekker (f.eks. databaseforbindelse, køoppbygging, minneforbruk),
    • Varsling etter alvorlighetsgrad,
    • Runbooks for gjenstart og typiske feil.

    En praktisk refaktorering-plan i 6 trinn

    For at refaktorering ikke skal gå i stå i det daglige arbeidet, hjelper en klar plan som er kompatibel med release-sykluser. Et velprøvd fremgangsmåte:

    1. Risiko- og endringskart lage (moduler, grensesnitt, data, drift).
    2. Spenn et sikkerhetsnett: loggingstandard, første regresjons-/Golden-Master-tester for kritiske baner.
    3. Tegn arkitektoniske separasjonslinjer: tjenestelag og innkapsling av data-tilgang som ’ny normal‘ for endringer.
    4. Refaktorer hotspots: modulene som ofte endres og forårsaker feil (bruk feilstatistikk og endringshistorikk).
    5. Konsolider datatilgang: FireDAC/transaksjoner/timeouter ensartes, mål ytelse, sjekk for deadlocks.
    6. Åpne moderniseringsstier: grensesnitt (REST), plattformtemaer (Unicode/64-Bit), trinnvis UI-modernisering der det er fornuftig.

    Kjernen er rekkefølgen: først transparens og sikring, deretter strukturtiltak, så større ombygninger. Slik forblir løsningen leveringsdyktig og driftssikker.

    Når refaktorering ikke er nok: tegn på at en større modernisering kreves

    Det finnes situasjoner der ren refaktorering ikke fjerner flaskehalsen. Typiske tegn:

    • Teknologiske blindveier: ikke lenger støttede databasedrivere, komponenter som ikke lar seg patche, harde 32-bit-avhengigheter.
    • Arkitekturen passer ikke lenger: f.eks. applikasjonen må drives som et tjenestelandskap, men alt er UI-sentrert.
    • Skalering og tilgjengelighet: krav til mandantstøtte, høy tilgjengelighet eller ekstern tilgang kan bare oppfylles med strukturelle endringer.
    • Sikkerhetskrav: autentisering/SSO, revisjon, kryptering lar seg ikke ettermontere uten større ombygginger.

    Også da er refaktorering ofte et fornuftig element: Det skaper orden slik at man målrettet kan løsrive deler i stedet for å erstatte hele systemet på én gang.

    Konklusjon: Refaktorering som teknisk ansvar i løpende drift

    Å refaktorere Legacy-kode i Delphi er først og fremst et spørsmål om prioritering, risikostyring og driftsnærhet. Hvis dere starter med en pålitelig kartlegging, sikrer hotspots, konsoliderer dataadgang og skillelinjer i arkitekturen, og målretter tester og logging mot kritiske stier, blir «opprydding» et styrbart moderniseringsprosjekt. Resultatet er ikke bare mer lesbar kode, men et system som er mer driftssikkert, tryggere å endre og enklere å integrere.

    Hvis dere ønsker å stabilisere eller modernisere deres Delphi-bestandsløsning på en strukturert måte, avklarer vi gjerne sammen utgangssituasjon, risikoer og en realistisk refaktoreringsvei:

    Im faglig miljø spiller også Delphi modernisering og Delphi refaktorering en viktig rolle, når integrasjoner, dataflyter og videreutvikling må fungere sømløst.

    Drøfte prosjekt eller moderniseringsinitiativ med Net-Base.

    Nächster Schritt

    Wenn aus dem Thema ein reales Projekt wird, sollten Architektur, Bestand und Betrieb früh zusammen betrachtet werden.

    Vi bistår ikke bare med enkeltspørsmål, men også når kodesnutter, legacy-temaer eller portalideer skal utvikles til et robust virksomhetsprosjekt.

    • Eksisterende tilstand, målbildet og tekniske risikoer vurderes samlet.
    • REST, Datenzugriff, Portale und Rollout werden nicht als Spätfolgen verschoben.
    • Sie sehen früh, welcher Weg wirtschaftlich und betrieblich tragfähig ist.

    Del innlegg

    Del dette innlegget direkte

    LinkedIn, X, XING, Facebook, WhatsApp und E-Mail sind sofort verfügbar. Für Instagram bereiten wir Link und Kurztext direkt vor.

    E-post

    Instagram åpnes i en ny fane. Lenken og kortteksten kopieres først til utklippstavlen.