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 drifter en forretningskritisk Delphi-applikasjon, kjenner spennet: Den kjører stabilt, dekker kjerneprosesser og er dypt integrert i databaser, grensesnitt og arbeidsflyter. Samtidig øker endringsarbeid og risiko for hvert release, fordi kompromisser, spesialtilfeller og avhengigheter har hopet seg opp over år. Her tar refaktorering av legacy-kode i Delphi tak: ikke som et «Rewrite»-prosjekt, men som en kontrollert ombygging i et system i drift – med målbare effekter på vedlikeholdbarhet, release-sikkerhet og drift.

I praksis mislykkes refaktorering sjelden på grunn av Delphi i seg selv, men på grunn av manglende transparens: Hva er forretningskritisk? Hvor ligger teknisk gjeld (altså strukturelle mangler som gjør senere endringer dyrere)? Hvilke deler kan berøres i vedlikeholdsvinduer, hvilke ikke? Og hvordan unngås det at «opprydding» introduserer nye feil eller ytelsesproblemer i produksjon? Dette innlegget beskriver en praksisnær tilnærming som tar med IT-ledelse og administrasjon: fra kartlegging via arkitektur- og datatemaer til tester, release-prosess og sikkerhetsspørsmål.

Hva betyr „Legacy“ i Delphi-prosjekter egentlig?

«Legacy» blir ofte likestilt med «gammelt». I bedriftskontekst er legacy-kode derimot først og fremst kode med høy endringsrisiko og et adferdsmønster som bare delvis kan forklares. 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, datatilgang og forretningslogikk er blandet; endringer gir sideeffekter.
  • Implisitte regler: Forretningslogikk ligger i hendelser, globale variabler eller database-triggere, ikke i tydelige moduler.
  • Utdatert datatilgang: f.eks. BDE (Borland Database Engine) eller proprietære komponenter; manglende pooling-/timeout-strategier.
  • Uensartet feilbehandling: Unntak blir svelget, meldinger havner ikke i sentralt logging.
  • Build- og release-skjørhet: Avhengigheter, sti-problemer, ulike kompilatorinnstillinger, manuelt etterarbeid.
  • Manglende tester: Kunnskap sitter i hodene eller i «klikksekvensen» til erfarne brukere.

Viktig: Legacy-kode er ikke automatisk «dårlig». Ofte er den et resultat av tidsnød, teknologisykluser og pragmatiske beslutninger. Refaktorering er da en investering i håndterbarhet – sett fra drift, sikkerhet, compliance og endringshastighet.

Refaktorering vs. Rewrite: Hva endres for drift og risiko

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

Praktisk avgrensning:

  • Refaktorering: Strukturen forbedres, eksternt adferd skal forbli likt. Fokus: Vedlikeholdbarhet, testbarhet, stabilitet, ytelsesreserver.
  • Omstrukturering/modernisering: i tillegg målrettede atferdsendringer, z. B. nye grensesnitt, ny database, nye plattformmål.
  • Omskriving: ny kodebase, vanligvis ny UI/arkitektur; krever migrasjon av data, prosesser, grensesnitt – ofte „Big Bang“ eller lang overgangsperiode.

For beslutningstakere er punktet sentralt: Refaktorering er ikke et mål i seg selv, men et virkemiddel for å redusere Change-Risiken. Dette er direkte relevant for drift når applikasjonen påvirker 24/7-prosesser, produksjonsnære arbeidsflyter eller kundevendte portaler.

Refaktorering av legacy-kode i Delphi: Start med en robust tilstandsoversikt

Det første steget er ikke et verktøy, men en felles forståelse av risikoer og mål. Uten denne forståelsen havner 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, innsamling av produksjonsdata, fakturering, rettighetsstyring. Legg til driftsparametre: vedlikeholdsvinduer, rollback-muligheter, overvåking, datavolum, latenskrav.

Nyttige kontrollspørsmål:

  • Hvilke funksjoner må også ved delvise feil fortsette å kjøre (degraderingsfunksjonalitet)?
  • Hvor finnes „Single Points of Failure“ (z. B. ein zentraler Scheduler)?
  • Hvilke data er regulatorisk eller personvernmessig sensitive?
  • Hvilke integrasjoner er mest feilutsatte (Datei-Importe, TCP/IP, SOAP/REST, Messaging)?

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

I Delphi-prosjekter er teknisk gjeld ofte arkitektonisk: globale tilstander, sykliske enhetsavhengigheter, vanskelig testbare dataadganger, eller UI-hendelser som „Orchestrierung“. Metrikker (z. B. kompleksitet, enhetsstørrelse, avhengighetsgraf) hjelper, men er først verdifulle når de omsettes til tiltak.

Et praxistaugliches rammeverk er en 2×2-betraktning:

  • 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 „schön machen“.
  • Sjelden endret & lite risikabelt: la ligge med vilje.

3) Inventariser avhengigheter: Daten, Schnittstellen, Laufzeit

For administrasjon og prosjektansvarlige er det avgjørende hva som ligger utenfor koden: Datenbank-Backends, ODBC/OLE DB, Dateifreigaben, Druck- und PDF-Strecken, COM/ActiveX, Office-Automation, Windows-Services, geplante Tasks, Zertifikate, Proxy-Konfigurationen.

Her oppstår refaktoreringkostnader ofte indirekte: en „kleine“ endring kan tvinge fram ny installer-logikk, nye rettigheter eller nye brannmurregler. Disse Nebenwirkungen bør dokumenteres tidlig i en teknisk Landkarte.

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

Refaktorering blir håndterbart når det retter seg mot tilbakevendende mønstre. Følgende felt er i praksis ofte de største risiko- og kostnadsfaktorene.

Monolithische Forms: Wenn die UI das System zusammenhält

Mange VCL-applikasjoner har historisk vokst fram som „formdrevne“: Skjemaet laster data, sjekker regler, skriver tilbake, utløser rapporter og oppdaterer andre skjemaer. Det fungerer – inntil flere team eller flere års endringshistorikk kolliderer.

En operativt bevist metode er å avlaste UI gradvis:

  • Use-case-nære tjenester innføre: faglige operasjoner som klart navngitte metoder i stedet for hendelseskjeder.
  • Kapsle datatilgang: spørringer/transaksjoner ikke i UI-hendelser, men i data-tilgangslag.
  • DTO-er/Modeller (enkle dataobjekter) bruke for å skille skjemaets tilstand fra databasen.

Målet er ikke „pattern-renhet“, men bedre testbarhet og færre sideeffekter: En endring i validering eller beregning skal ikke sette hele UI-klikksekvensen i fare.

Modernisere datatilgang: BDE erstatte, FireDAC konsekvent bruke

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

BDE-erstatning med native tilkobling (Delphis moderne data-tilgangsbibliotek) er i mange scenarier en fornuftig standard, hvis det arbeides konsekvent: ensartede tilkoblingsparametere, klare transaksjonsgrenser, timeouts, pooling og ryddig unntakshåndtering. Typiske refaktoreringsgrep 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-caset, ikke skjult i UI.
  • Bruk parameteriserte spørringer konsekvent for å redusere SQL-injeksjonsrisiko og problemer med spesialtegn.
  • Definer timeouts og gjenforsøk, slik at nettverksproblemer ikke fører til „frosne“ skjemaer.

For IT-drift er det viktig at nye tilkoblingsstrategier koordineres med databaseoperasjoner (f.eks. maksimale forbindelser, pool-størrelser, deadlock-håndtering, vedlikeholdsvinduer for skjemaendringer).

Unit-Abhängigkeiten und „globale Zustände“ als Hauptursache für Seiteneffekte

Delphi-Units med store Interface-Sections, mange Uses-Einträge og globale Singletons er typiske pådrivere for sideeffekter. En liten endring i en Unit utløser rebuild-kaskader eller bryter skjulte initialiseringsrekkefølger.

Pragmatiske tiltak som fungerer i legacy-prosjekter:

  • Fastsett avhengighetsretninger: f.eks. UI → Application Services → Domain/Logikk → Data Access → Infrastruktur.
  • Sentralt initialisere: klar startup-sekvens i stedet for Unit-Initialization som skjult styring.
  • Reduser globale variabler: hold tilstand i objekter, avklar levetid og eierskap.

Det bidrar til stabilitet: Når oppstart er deterministisk, er feil etter oppdateringer eller konfigurasjonsendringer bedre håndterbare.

Trådbehandling und Synchronisation: Stabilität vor „Performance-Optimierung“

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

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

  • Klar ownership for tråder/oppgaver og definert nedstengning (slik at oppdateringer/avslutning ikke henger).
  • Loggføring per worker med korrelasjons-ID, for å kunne spore forløp.
  • Minimer synkronisering og kapsle UI-tilganger strikt (UI-trådregelen).

Hvis dere vil gå dypere, er det hensiktsmessig å 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.

Arkitekturmålbilde: Layering som verktøy, ikke dogme

Et praktisk målbildet for mange Delphi-bestandsløsninger er en klar lagstruktur (ofte forstått som «3-lag»): Presentasjon (UI), applikasjonslogikk (use cases/tjenester) og dataadgang (Repositories/DAO). Viktig er det driftsmessige perspektivet: Layering gjør det enklere med tester, oppdateringer og senere utskilling av grensesnitt.

Konkrete fordeler for virksomheten:

  • Ettermontere grensesnitt (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 ansvarsfordelingen 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 igjen myker opp strukturen.

Teststrategi for Delphi-refaktorering: Hvordan fryse atferd før ombygging

Refaktorering uten tester er i forretningskritiske systemer en risiko. Samtidig er full testautomatisering ofte ikke realistisk på kort sikt. Det sentrale er derfor: test målrettet der risikoen og endringspresset er høyt.

Golden Master og regresjon: Praktisk for legacy

En «Golden Master» er en referanse for dagens oppførsel: inndata og forventede utdata fanges opp for å oppdage avvik etter endringer. Dette egner seg for rapporter, beregninger, eksport, import-pipelines eller grensesnittsresponser.

Viktig for drift: Golden Master-tester reduserer risikoen for at bivirkninger først viser seg etter utrulling – og de støtter raske hotfix-beslutninger fordi avviket er konkret målbart.

Integrasjonstester rundt database og grensesnitt

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

  • Transaksjonsatferd ved feil (rollback, delvise oppdateringer, låsinger).
  • Tegnkoding ved import/eksport (CSV, XML, JSON), spesielt ved spesialtegn.
  • Ytelsesprofiler for typiske datamengder, for å oppdage gradvise forverringer.

Manuelle testtilfeller forblir – men strukturert

Hvor automasjon (ennå) mangler, hjelper strukturerte manuelle testplaner som er knyttet til releaser. Fra administrasjonssynspunkt er det relevant at testtilfeller også inneholder driftsaspekter: installasjons-/oppdateringsvei, rettigheter, konfigurasjon, logging/overvåking, skriver/PDF, nettverksstier.

Data og migrasjon: Refaktorering avgjøres ofte ut fra skjema

I Delphi-systemer har databasestrukturer vokst over år. Refaktorering kolliderer ofte med „historiske“ tabeller, doble felt eller faglig overlastede kolonner. Det kritiske punktet: skjemaendringer påvirker drift, Backup/Restore, replikasjon, rapportering og grensesnitt.

Gjør skjemaendringer planbare

En veletablert tilnærming er tydelig versjonerte databasemigrasjoner: Hver endring i skjema dokumenteres som et reproduserbart steg, inkludert rollback-strategi. Selv om migrasjoner i første omgang kjøres manuelt, er disiplinen avgjørende: ingen „wir ändern schnell in Produktion“.

For release-sikkerhet bør dere fastsette:

  • Behov for nedetid: Mulig med online-migrasjon eller kreves vedlikeholdsvindu?
  • Tilbakestrategi: Datakompatibilitet ved rollback, Backups før migrasjon, plan for gjenoppstart.
  • Kompatibilitetsfase: Applikasjonen kan i en overgangsperiode fungere med både gammelt og nytt skjema (f.eks. ekstra kolonner, Views).

Ikke undervurder datakvalitet og opprydding

En refaktorering avdekker ofte dataproblemer som tidligere „svevde med“: ugyldige verdier, inkonsistenser, manglende fremmednøkler. Her er det viktig å ta faglige beslutninger om hva som er korrekt. Teknisk bør applikasjonen fremover validere strengere og loggføre feil på en etterprøvbar måte, i stedet for å rette dem stille.

Ettermontere grensesnitt uten å destabilisere legacy-systemet

Mange selskaper refaktorerer Delphi-bestandene fordi nye krav tvinger fram integrasjoner: portaler, BI, mobile prosesser, partnerintegrasjoner. Den vanligste feilen er å mate grensesnitt direkte fra UI-logikk eller „irgendwo aus dem Code“. Bedre er å legge grensesnittene på et konsolidert tjenestelag som etableres allerede under refaktoreringen.

Når en REST-API (Representational State Transfer, vanlig web-API over HTTP/JSON) ettermonteres, er følgende spesielt viktige fra drift- og sikkerhetssynspunkt:

  • AuthN/AuthZ: Skille autentisering og autorisering tydelig; f.eks. tokens, SAML 2.0 i sammenheng med bedrifts-SSO, klare rollemodeller.
  • Ratebegrensninger og Timeouts: slik at eksterne klienter ikke blokkerer backend.
  • Versjonering: definere API-versjoner for å unngå at klienter brytes ved hver endring.
  • Observability: strukturerte logger, korrelasjons-IDer, målinger (feilrate, latenser).

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

Sikkerhet og Compliance: Refaktorering som en mulighet til å lukke sikkerhetshull

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

  • Credentials und Secrets: ingen passord i INI-filer eller i koden; sikker lagring og rotasjon.
  • Transportkryptering: TLS for grensesnitt, ordentlig sertifikathåndtering.
  • Least Privilege: databasebrukere og filrettigheter så minimale som mulig; separate roller for lesing/skriving/administrasjon.
  • Revisjonssporbarhet: etterprøvbare endringer av kritiske data (Hvem? Hva? Når?), uten at loggdata skaper personvernproblemer.
  • For IT-ledelsen er dette en sentral forretningsfordel: Refaktorisering reduserer ikke bare vedlikeholdskostnader, men kan også senke sikkerhets- og revisjonsrisiko hvis den gjennomføres strukturert.

    Release- og driftsprosess: Uten en pålitelig pipeline blir refaktorisering dyrt

    Mange Delphi-legacy-prosjekter lider mindre av koden enn av prosessen: Builds varierer mellom arbeidsplasser, Releases er manuelle, feil kan ikke spores tydelig. Refaktorisering bør derfor alltid også stabilisere leveranseprosessen.

    Byggreproduserbarhet og konfigurasjonsstyring

    Fra administrasjonens og revisjonens perspektiv er det viktig at et Release er reproduserbart: samme kildekode, samme kompilator-/bibliotekversjoner, samme avhengigheter. Dette inkluderer klart adskilte konfigurasjoner for utvikling, test og produksjon (f.eks. databaseendepunkter, loggnivå, feature-flags).

    Logging, overvåking og støtteevne

    «Det skjedde noe» er ikke nok i drift. Refaktorisering er en god anledning til å innføre enhetlig logging: strukturerte logginnslag, entydige feilkoder, kontekst (bruker, kunde/mandant, oppdrag, grensesnitt) og klar separasjon mellom tekniske feil og faglige valideringer.

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

    • Health Checks (f.eks. databaseforbindelse, køstopp, minneforbruk),
    • Varsling etter alvorlighetsgrad,
    • Runbooks for gjenoppstart og typiske feil.

    En praktisk refaktoreringsplan i 6 trinn

    For at refaktorisering ikke skal drukne i daglig drift, hjelper en klar fremdriftsplan som er kompatibel med Release-sykluser. Et velprøvd fremgangsmåte:

    1. Utarbeide risiko- og endringskart (moduler, grensesnitt, data, drift).
    2. Etablere sikkerhetsnett: logging-standard, de første regresjons-/Golden-Master-tester for kritiske stier.
    3. Sette arkitektoniske avgrensningslinjer: servicesjikt og innkapsling av data-tilgang som «ny normal» for endringer.
    4. Refaktorer hot spots: modulene som ofte endres og forårsaker nedetid (bruk feilstatistikk og endringshistorikk).
    5. Konsolider datatilgang: FireDAC/Transaktionen/Timeouts standardisere, måle ytelse, sjekke deadlocks.
    6. Åpne moderniseringsveier: grensesnitt (REST), plattformtemaer (Unicode/64-Bit), gradvis UI-modernisering der det er hensiktsmessig.

    Kjernen er rekkefølgen: Først transparens og sikring, deretter strukturelle tiltak, så større ombygginger. På den måten forblir løsningen leveringsdyktig og driftsstabil.

    Når refaktorisering ikke er nok: signaler for en større modernisering

    Det finnes situasjoner der ren refaktorisering ikke løser flaskehalsen. Typiske signaler:

    • Teknologiske blindveier: databasedrivere som ikke lenger støttes, komponenter som ikke kan patches, faste 32-bit-avhengigheter.
    • Arkitekturen passer ikke lenger: f.eks. applikasjonen må driftes som en tjenestelandskap, men alt er UI-sentrert.
    • Skalering og tilgjengelighet: krav til multitenancy, høy tilgjengelighet eller fjernaksess kan bare møtes med strukturelle endringer.
    • Sikkerhetskrav: autentisering/SSO, revisjon, kryptering lar seg ikke ettermontere uten omfattende ombygging.

    Også da er refaktorering ofte en fornuftig del: Det skaper orden slik at man målrettet kan skille ut deler, i stedet for å erstatte hele systemet på én gang.

    Konklusjon: Refactoring som teknisk ansvar i løpende drift

    Legacy-kode i Delphi å refaktorere er først og fremst et spørsmål om prioritering, risikostyring og driftsnærhet. Hvis dere starter med en pålitelig statuskartlegging, sikrer hotspotene, konsoliderer datatilgang og arkitektoniske skillelinjer og retter tester samt logging målrettet mot kritiske baner, blir «opprydding» et styrbart moderniseringsprosjekt. Resultatet er ikke bare mer lesbar kode, men et system som er mer pålitelig å drifte, tryggere å endre og enklere å integrere.

    Hvis du ønsker å stabilisere eller modernisere din Delphi-eksisterende løsning på en strukturert måte, avklarer vi gjerne sammen utgangssituasjon, risikoer og en realistisk refaktoreringsvei:

    Im faglige miljø spiller også Delphi modernisering og Delphi refaktorering en viktig rolle når integrasjoner, dataflyt og videreutvikling må spille godt sammen.

    Drøfte prosjekt eller moderniseringsprosjekt med Net-Base.

    Neste trinn

    Når et tema blir et reelt prosjekt, bør arkitektur, eksisterende systemer og drift vurderes samlet allerede tidlig i prosessen.

    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, datatilgang, portaler og utrulling blir ikke utsatt som etterfølgende oppgaver.
    • Dere ser tidlig hvilken vei som er økonomisk og driftsmessig levedyktig.

    Del innlegg

    Del dette innlegget direkte

    LinkedIn, X, XING, Facebook, WhatsApp og e-post er umiddelbart tilgjengelige. For Instagram forbereder vi lenke og kort tekst umiddelbart.

    E-post

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