Ó théama an iris go cleachtas tionscadail
Leathanaigh seirbhíse agus teicniúla oiriúnacha don alt
Má oibríonn tú iarratais VCL ar chliaint nua-aimseartha Windows, tagann tú trasna den tsaincheist seo go luath nó go déanach: bíonn na deilbhíní ag breathnú mínshamhlaithe, frayed nó le imeall liath ag 125%/150%/200%. Sa chás seo éiríonn an ábhar VCL High-DPI Icons praiticiúil: ní toisc go bhfuil High-DPI nua, ach toisc go léirítear na fadhbanna de ghnáth sa chleachtas e ar fhreastalaithe deisce iargúlta, le linn athrú ar dhocháil an nótaí nó nuair a bhíonn DPI éagsúil ar gach monatóir.
Is annamh go mbíonn an fhadhb mar gheall ar “is briste mo PNG”, níos minice is í an slabhra oibre an chúis: cé as a thagann an deilbhín (acmhainn, comhad, SVG, cló), i cén mhéid a chuirtear ar fáil é, conas a chríochnaíonn sé sa TImageList agus cé a scálaíonn cathain agus conas. Sa VCL tagann roinnt coincheapa le chéile a gcaithfear idirdhealú a dhéanamh orthu: DPI-Awareness (an ndéanann Windows an aip a shcaileáil nó an aip í féin), Per-Monitor-DPI (is féidir le gach monatóir a bheith éagsúil) agus ImageList-Strategie (iléagar éagsúil a choinneáil nó iad a thiontú go bitmap ag am reatha).
Sa trácht seo ní bhaineann sé le díospóireachtaí deartha UI, ach le cur chuige glan agus iontaofa ó thaobh oibríochta: deilbhíní a scálú ag am reatha ar bhealach nach gcuirfidh siad i staid “múcas picteilí”, ionas go bhfanfaidh canálacha alfa slán agus ionas go n-oibreodh athruithe DPI gan splancadh nó gan méideanna íomhá míchearta. Chomh maith leis sin pléifimid rioscaí, leideanna dífhabhtaithe agus measúnú macánta ar cathain a bhíonn an iarracht bhreise fiúntach.
Cén fáth a dtarlaíonn máil picteilí: an slabhra scála sa VCL a thuiscint
Is é an chúis is coitianta le deilbhíní neamhlíneacha ná scálú síos/up aonair ag an am mícheart. Sreabhadh clasaiceach i Legacy-VCL:
- Soláthraíonn an iarratas deilbhíní i 16×16 nó 24×24 amháin.
- Windows nó an VCL a scálaíonn iad go 20×20 / 32×32 / 48×48.
- Úsáideann an scálaí idirghníomhú/interpolation a oireann do ghrianghraif, ach a smálann imeallacha i ngrafaic picteilí.
- Ina theannta sin, brúitear an trédhearcacht (alpha) isteach i loighic masc nó tiontaítear í iolrach uaireanta.
Bíonn sé go háirithe casta nuair a tharlaíonn roinnt scáluithe ina dhiaidh a chéile: mar shampla nuair a sholáthraíonn an ImageList bitmap atá scálaithe cheana féin agus nuair a scálaíonn Windows arís mar gheall ar easpa DPI-awareness nó DPI an chórais. Toradh: neamhlíneacht dúbailte.
Pointe eile, a bhíonn minic á bhmeas íseal i bproicéid, is ea an am scála. Le Per-Monitor-DPI (PMv2, i.e. Per-Monitor-DPI-Awareness v2) d’fhéadfadh an DPI éifeachtach athrú nuair a aistríonn fhuinneog chuig monatóir eile nó nuair a choigeartaíonn cliant Remote-Desktop an DPI go dinimiciúil. Má nach ndéantar TImageList nó an cache a ath-thógáil i gceart, feictear deilbhíní go tobann i méid mícheart nó lena raster mícheart.
TImageList faoi High-DPI: botúin tipiciúla i n-iarratais fhíorúla
Bhí TImageList ceaptha go stairiúil do bitmápanna beaga, le toisí daingean, innéacsanna agus le loighic stórála sách soladach. Faoi High-DPI cruthaíonn sé seo gaisteanna praiticiúla:
1) Width/Height daingean
Socraíonn go leor foirmeacha VCL ImageList.Width/Height ag am an dearaidh agus fágann siad é mar sin. Ag 150% bheadh Windows ag iarraidh, mar shampla, ó 16×16 a dhéanamh go 24×24. Má fhanann an liosta ag 16×16, beidh sé nó gearrtha nó scálaithe áit eile — agus beidh an dá rud míchothrom.
2) PNG-Alpha agus loighic mascanna
Ag brath ar leagan Delphi agus ar na rialuithe VCL, faigheann tú measctha go tapa: coinneáiltear PNGanna le alpha go hinmheánach uaireanta mar bitmap 32-giotán, uaireanta mar Mask+Color. Nuair a dhéanann tú comhdhlúthú iluaire (PNG → Bitmap → ImageList → Draw), cruthaíonn sé scáthanna liath nó imeall crua. Is minic go mbraitheann an éifeacht ar chúlra: ar bharra uirlisí dorcha léiríonn sé níos measa ná ar phainéal éadrom.
3) Athruithe DPI ag rith an ama: Caches, Handles, OwnerDraw
Coinníonn roinnt rialuithe cur i láthair na n-íomhánna i gcacha nó glacann siad Handles ó ImageList ag pointe nach bhfuil an DPI críochnaithe fós. Go háirithe ar Toolbars, TreeViews/ListViews agus i scénáir OwnerDraw feictear ó am go chéile toisí íomhá míchearta nó lógónna folmha go dtí go ndéanfar repaint nó RecreateWnd.
4) Terminalserver agus Remote-Desktop mar thástáil réaltachta
Má úsáidtear an aip trí RDP, níl athruithe DPI agus athnasctha seisiún neamhchoitianta. Go díreach ansin téann straitéis ImageList nach bhfuil seasmhach i léig: feiceann an t-úsáideoir lógónna míochúnta nó barraí uirlisí scálaí mícheart tar éis an athnasctha, cé go raibh gach rud ceart go leor go háitiúil.
Cur chuige soiléir: réitigh iolracha a sholáthar seachas uasscáil bhrúidiúil
Is é an cinneadh is tábhachtaí go coincheapúil: an bhfuil tú ag iarraidh lógónna a uasscála ag rith an ama ó ghrafach bhunúsach amháin (m.sh. ó 16×16 go 32×32), nó an soláthraíonn tú roinnt réitigh dúchais agus an roghnaíonn tú an ceann cuí de réir an DPI?
Sa chleachtas, bíonn tairbhe ag an gcur chuige “ilréitigh” beagnach i gcónaí. Is féidir uasscáil a dhéanamh má tá an fhoinse bunaithe ar veicteoir (SVG, Icon-Font) nó má theastaíonn fachtóirí measartha amháin. Nuair a uasscálaíonn tú go mór ó íomhá raster bheag, cailltear cáilíocht imeall, agus feiceann tú é sin láithreach ar thaispeántais nua-aimseartha.
Sa domhan VCL tá dhá bhloic ábhartha don chur chuige seo inniu:
- TImageCollection: coimeádán do íomhánna i roinnt méideanna/athrógacha.
- TVirtualImageList: cruthaíonn sé ImageList ag rith an ama sa mhéid atá de dhíth faoi láthair agus freagraíonn sé d’athruithe DPI.
Ní réitíonn sé sin gach fadhb, ach cuireann sé an fhadhb san áit cheart: sonraíonn tú foinsí íomhá go soiléir, agus déantar an scálaiú/roghnú go comhsheasmhach.
Icons VCL High-DPI a scála ag rith an ama: Cathain atá sé ciallmhar (agus cathain nach bhfuil)
Tá cúiseanna bailíocha ann lógónna a scála ag rith an ama:
- Luchtófar lógónna go dinimiciúil (m.sh. ó fhillteán breiseán, pacáistí branda custaiméara, pacáistí cumraíochta).
- Ba mhaith leat píopa aonfhoirmeach do fhoinsí éagsúla (ICO, PNG, SVG) agus níor mhaith leat gach éagsúlacht a cheangal ag am tógála.
- Gineann tú lógónna go cláraithe (badganna stádais, overlays, siombailí comhdhéanta).
Níl scálaíocht i rith ama loighciúil má tá tú i ndáiríre ag úsáid díreach íomhánna barra uirlisí clasaiceacha ó shuirbhé buan. Sa chás sin is é an bealach is éasca ó thaobh cothabhála ná: seol go glan roinnt réitigh agus lig don VCL iad a roghnú.
Mura bhfuil tú ag déanamh scálaíochta i rith ama, déan é le rialacha soiléire:
- Riamh ná scálaigh bitmap atá scáileáilte cheana féin arís. Tosaigh i gcónaí ó fhoinse mhaistir (roghnach vektarbunaithe nó ard-réitigh).
- Cache in aghaidh an mhéid sprioc agus an DPI, murach sin beidh tú ag scálaú arís gach uair a bhíonn an paint — ídíonn sin CPU agus féadfaidh sé moill/ruclú a chur ar an UI.
- Coimhnigh an Alpha: laghdaigh tiontuithe, úsáid 32-bit RGBA, ná rasteráil an chúlra.
Architectúr Phragmatach: Píblíne deilbhíní mar chomhlacht neamhspleách
I bhfeidhmchláir níos mó tá sé inmholta an réiteach a lonnú seachas é a scaipadh go léir ar fud an chód — tóg píblíne bheag. Ní gá go mbeadh sí ina framework; ba chóir di ach réimse tráchta soiléir a sholáthar:
- Icon-Quelle: Cé an áit a dtagann na maiseanna máistir ó (acmhainní, comhaid, bunachar sonraí, API)?
- Rasterálaí/Scálaí: Conas a chruthaítear an méid sprioc ó na maiseanna máistir (idirghabháil, más gá SVG-render)?
- Cache: Eochair (Icon-ID, picteilín sprioc, DPI, Theme) agus saolré (neamhbhailíochtú nuair a athraíonn DPI, téama nó pacáiste).
- Consumer-Adapter: Conas a fhaigheann an tomhas deiridh isteach i struchtúir VCL (TImageList/TVirtualImageList, OwnerDraw, PaintBox)?
Buntáiste: is féidir leat fabhtanna DPI a athchruthú agus a dhífhabhtú in aon áit amháin in ionad iad a lorg ar fud 40 Forms.
DPI-athruithe a láimhseáil i gceart: Imeachtaí, Atógáil, Athphéintáil
Faoi Windows is tréimhse shaol neamhspleách iad athruithe DPI. Sa VCL, de réir na leaganacha agus an DPI-awareness, tá roinnt imeachtaí/meicníochtaí ann, ach fanann an príomhsmaoineamh mar an gcéanna:
- Nuair a athraíonn an DPI den fhuinneog, ní mór acmhainní bunaithe ar íomhá a bhfuil siad picteilín-precise a chur ar fáil arís.
- Nuair a líonann tú ImageLists go dinimiciúil, ní bheidh Invalidate amháin sábháilte de ghnáth — teastaíonn Atógáil na n-íomhánna sa mhéid sprioc nua uait.
Pátrún praiticiúil: ar athrú DPI (m.sh. Form-Scale/Monitorwechsel) déan neamhbhailíochtach den缓存 deilbhíní do sin an DPI agus atógáil na ImageLists atá buartha. Tábhachtach: ná scálaigh laistigh de imeachtaí Paint; déan é i mbloc nuashonraithe rialaithe (Toolbar.BeginUpdate/EndUpdate, ListView-Redraw as, ansin ar ais). Mar sin seachain tú splancanna agus staidí UI leathchríochnaithe.
Cén fáth a mbíonn TImageList neamhlíonadh go minic: Interpolation, DPI-Ríomh, Imeallacha
Nuair a thuigfidh tú uair amháin nach bhfuil an fhadhb i DPI i ndáiríre, ach san idirghabháil agus an rannán, mínítear go leor éifeachtaí:
- Rúndáil DPI: 125 % ist kein sauberer Verdoppler. Aus 16 px werden 20 px (16 * 1,25). Aus 24 px werden 30 px. Das sind krumme Zahlen, die Pixelkanten erschweren.
- Scagaire Athsamplála: Bilinear/Bicubic macht Kanten weicher. Das ist für Fotos ok, für Icons oft nicht.
- Éifeachtaí Subpixel: Windows kann je nach Renderpfad Subpixel-Antialiasing nutzen oder nicht. Bei Icons willst du kontrollierte Kanten und möglichst keine mehrfachen Filterstufen.
Wenn du Raster-Icons hast, ist es in vielen Teams gängige Praxis, pro Zielgrößen eigene PNGs zu liefern (16/20/24/32/40/48). Klingt nach viel, ist aber oft weniger Aufwand als jahrelang zu debuggen, warum das auf diesem Monitor komisch aussieht.
Debugging: Pixelmatsch reproduzierbar machen statt nach Bauchgefühl zu fixen
High-DPI-Bugs wirken oft zufällig. Mit ein paar Checks werden sie deterministisch:
1) DPI und ImageList-Größen zur Laufzeit loggen
Logge bei Start und bei DPI-Wechsel: CurrentPPI des Forms, Screen.PixelsPerInch (Achtung: das kann System-DPI sein), sowie ImageList.Width/Height der betroffenen Listen. Wenn du nach einem Monitorwechsel noch 16 siehst, obwohl du 32 erwartest, ist die Ursache klar: Rebuild fehlt oder kommt zu spät.
2) Icons sichtbar vergrößern
Ein schneller Test ist, die Toolbar-Icons temporär auf 48 px zu setzen. Schlechte Skalierung springt dann sofort ins Auge. Gute Pipelines bleiben auch bei 48 px scharf, weil sie aus einer passenden Quelle rastern.
3) Theme- und Hintergrundwechsel testen
Halos am Rand sind oft Alpha-/Premultiply-Probleme. Teste auf hell/dunkel und auf Flächen mit Farbverlauf. Wenn die Kante je nach Hintergrund anders aussieht, stimmt die Transparenzbehandlung nicht.
4) Remote Desktop / Monitorwechsel als Testskript
Erstelle ein kurzes Testskript für die QS: App starten auf Monitor A (100 %), Fenster auf Monitor B (150 %), zurück, dann RDP reconnect. Wenn das stabil ist, sind viele Kundenprobleme bereits erschlagen.
Migration in bestehenden Anwendungen: Schrittweise statt Big Bang
In gewachsenen Delphi-VCL-Anwendungen steckt die Icon-Logik oft an vielen Stellen: Menüs, Toolbars, ActionLists, TreeViews, Statusanzeigen. Ein Big-Bang-Umbau bringt Risiko. Bewährt hat sich ein schrittweises Vorgehen:
- Inventur: Welche ImageLists gibt es? Welche Controls nutzen sie? Welche Größen werden erwartet?
- Priorisieren: Zuerst die prominentesten Flächen (Haupttoolbar, Navigation, Kontextmenüs).
- Einheitliche Quelle: Icons zentralisieren (ImageCollection oder eigener Loader), statt pro Form Einzeldateien zu laden.
- DPI-Wechsel testen: Ab dem ersten umgebauten Modul konsequent DPI-Wechsel-Tests fahren.
Tábhachtach: Má tá tú ag rith píblíne sean agus nua i gcomhthráth, doiciméadaigh rialacha soiléire. Murach sin, cruthófar timpeallacht mheasctha ina mbeidh cuid de na h-icoananna géar agus cuid eile le feiceáil go soiléir míchruinne.
Feidhmíocht agus Cuimhne: Scálaíocht ag rith ama gan fo-iarmhairtí
Tá costas ag baint le scálaíocht ar an CPU agus ar an gcumas cuimhne. I mbogearra gnó ní bhíonn sé seo le sonrú go minic i stát neamhghníomhach, ach nuair a bhíonn tú ag tarraingt fuinneoige chuig monatóireacht nua nó agus ag tosú le go leor foirmeacha is féidir go mbeidh stallaí. Trí threoirlínte phraiticiúla:
- Srian ar mhéid an chaché: Ná coinnigh gach céim idirlínse go deo. Má theastaíonn uait ach 100% agus 150%, cacheáil ach na méid sin.
- Tógáil leisciúil (Lazy Build): Rasteraigh na h-icoananna ach nuair is gá dóibh ar an scáileán. I gcás biachláir mhóra sábhálfaidh sé sin am tosaithe.
- Ath-thógáil i mbaisc (Batch-Rebuild): Ná spreag gach rialtóir ar leithligh le linn athrú DPI. Cuireann ath-thógáil lárnach bac ar scálaíocht athráite.
Má oibríonn tú le TVirtualImageList, tá cuid mhór den choincheap seo curtha i bhfeidhm cheana féin, ach caithfidh tú fós aire a thabhairt nach gcuirfidh tú scálaíocht shaincheaptha breise leis an gciseal sin.
Straitéisí Eisceachta: Cad a dhéanamh má níl na méideanna icoan ar fad ar fáil?
Sa fhírinne, ní bhíonn na h-ácmhainní i gcónaí ar fáil i ngach méid. Sa chás sin teastaíonn straitéis eisceachta soiléir chun torthaí randamacha a sheachaint:
- Béim ar ísliú: Is fearr ísliú ó 64 px go 32 px ná ardú ó 16 px go 32 px.
- Sainmhínigh céimeanna: Socraigh cén mhéideanna sprioc atá i ndáiríre tacaíochta (m.sh. 16/20/24/32/40/48) agus mapáil DPI go soiléir chucu.
- Tástáil trédhearcachta: I gcás eiscéachtaí bí go háirithe aireach ar an chiseal alfa — is ansin a fhoirmítear haloí.
Is earráid choitianta ná glacadh le haon mhéid in aice láithreach. Mar thoradh air sin athraíonn an géire a thuigtear ó icoan go icoan. Is fearr plean slí mapála daingean agus doiciméadaithe.
Cathain is fiú an iarracht i ndáiríre?
Tá trí tháscaire soiléir a léiríonn go bhfuil luach i líne píblíne íon do h-icoananna High-DPI:
- Oibríonn do úsáideoirí le monatóir mheasctha (laptop + monatóir seachtrach) nó go leor tríd RDP.
- Tá an feidhmchlár buan agus á chothabháil ar feadh blianta — tá an tuiscint ar an UI mar chuid den ghlacadh.
- Tá céimeanna nua-aoiseach pleanáilte agat cheana féin (DPI-Awareness a ardú, rialuithe a mhalartú, leagan amach an toolbar a athbhreithniú).
Mura bhfuil an aip ach ar chóras kiosk seasta le réiteach comhuaineach, is féidir an topaic a choinneáil íosta: soláthair méid icoan oiriúnach, socraigh DPI-Awareness i gceart — sin é.
Conclúid: Ní sonraí maisiúla é High-DPI, ach cinneadh maidir le rindreáil
Is minic nach earráid aonair í icoananna míchruinne sa VCL, ach léiriú ar shlabhra neamhghlan idir na foinsí, an scálaíocht agus an cacháil. Is é an cur chuige is láidre ná icoananna a sholáthar i roinnt réiteach agus iad a sheachadadh go comhsheasmhach trí phíblíne lárnach (m.sh. ImageCollection/VirtualImageList nó do chiseal icoan féin). Bíonn scálaíocht ag rith ama oiriúnach nuair atá foinsí dinimiciúla nó siombailí comhdhéanta agat — ach amháin má tá foinse mháistir, caché bunaithe ar DPI agus rialacha ath-thógála soiléire agat.
Mura bhfuil tú cinnte cén chomharthaí atá agat (athrú DPI a scriosann icoananna, haloí ar an imeall, méideanna mícheart tar éis RDP), is fiú an topaic a ihsaídiú go spriocdhírithe agus a chóireáil mar bhloic bheag ailtireachta seachas sraith réitigh oibre in aghaidh gach foirme. Má theastaíonn uait tacaíocht le dífhabhtú nó le nuachóiriú céim ar chéim, gheobhaidh tú an tús cuí anseo: Kontakt zur Net-Base Software GmbH.
Tá Timagelist High Dpi agus Delphi Vcl Dpi-Awareness tábhachtach don ábhar seo. Míníonn an t-alt na gnéithe seo go soiléir agus taispeánann sé cad atá tábhachtach i ngnáthúsáid.
Céim eile
Nuair a éiríonn an téama ina thionscadal iarbhír, ba cheart ailtireacht, maoin reatha agus oibríocht a mheas le chéile go luath.
Ní hamháin go dtacaímid le ceisteanna aonair, ach freisin nuair is gá ó shlisíní cód foinse, ó ábhair legacy nó ó smaointe portail tionscadal corparáideach iontaofa a fhorbairt.
- Measúnítear an staid reatha, an stát sprioc agus na rioscaí teicniúla le chéile.
- REST, rochtain ar shonraí, portaill agus Rollout, ní chuirfear iad siar mar iarmhairtí déanacha.
- Feicfidh sibh go luath cén bealach atá eacnamaíoch agus ó thaobh oibríochta inbhuanaithe.