< návrat zpět

MS Excel


Téma: Formulář s měnitelnou velikostí rss

Zaslal/a 29.8.2015 22:36

Ví někdo z vás, jak napsat formulář, u kterého lze během práce s ním měnit velikost jeho plochy včetně velikosti jeho aktivních prvků? Příklad dialogového okna s uvedenými vlastnostmi je v příloze a pochází z dialogu pro psaní vzorců pro názvy. Jde mi o úchyt vpravo dole v okně, za který lze myší měnit velikost jak okna, tak textboxu v něm.
Jde mi o to, jestli srovnatelnou schopnost lze udělit uživatelskému formuláři. Jestli ano, hledám postup pro vytvoření takového formuláře.

Příloha: jpg26509_dynamickydialog.jpg (10kB, staženo 29x)
26509_dynamickydialog.jpg
Zaslat odpověď >

Strana:  1 2   další »
#026511
Hav-Ran
Ahoj, prehľadal som svoj 100-ročný archív a mám pre teba prílohu od Stephena Bullena na priamu zmenu rôznych vlastností priamo na zobrazenom formulári cez API. Po zaškrtnutí "Sizeable" môžeš vykonať svoju potrebu 5citovat
#026515
avatar
Dík! To je krásné, čistě udělané a prakticky dokonalé řešení. To plně platí z pohledu té demonstrace. Horší je to s možností její aplikace. Ta demonstrace honí strašně moc zajíců najednou, obsahuje kopec API funkcí a vyznat se v tom, co za co může, pro mne bude oříšek (s velikostí nejmíň pořádného kokosového).
Jen velmi nerad používám černé skříňky, u kterých neumím rozlišit smysl věcí. Bullen je vynikající machr typu David Copperfield a své králíky tahá z klobouku s velkou grácií. Už se vidím, až se to pokusím udělat sám. Nejspíš z toho bude groteska...
Našel jsem alternativu v manuálu od Walkenbacha, který se odvolává na dalšího mága, Andy Popa. Jde o řešení bez API funkcí, což je lákavé. Někde cestou do českého vydání bohužel došlo ke zmatení popisu řešení, takže návod je bohužel nefunkční.
Mám teď dvě možnosti: rozluštit funkční, ale nečitelný kód od Bullena, nebo rozluštit čitelný, ale nefunkční text od Walkenbacha. A teď, babo, raď! 7citovat
#026519
elninoslov
Včera som našiel niečo od Bruin-a (odkaz už nemám som teraz na tablete) ale rovnako som to nerozchodil. V Delphi som kedysi takúto featurku urobil oveľa ľahšie. Škoda.citovat
#026523
avatar
Je to jednoduché.

1. Je třeba povolit oknu formuláře měnit velikost:

Např.:


Public Const WS_THICKFRAME = &H40000
Public Const WS_SIZEBOX = WS_THICKFRAME

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias _
"GetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias _
"SetWindowLongPtrA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal _
dwNewLong As LongPtr) As LongPtr

' WindowCaption = userform.caption
Sub PovolitZmenuVelikosti(WindowCaption As String)
ListaNastavitStyl WindowCaption, WS_SIZEBOX
End Sub

Sub ListaNastavitStyl(WindowCaption As String, Styl As Long)
Dim hWnd As Long
Dim exLong As Long
' Najít okno
hWnd = FindWindow(vbNullString, WindowCaption)
' Přečíst styl okna
exLong = GetWindowLongPtr(hWnd, -16)
' Pokud vlastnost není nastavena, tak nastavit
If (exLong And Styl) = 0 Then
SetWindowLongPtr hWnd, -16, exLong Or Styl
End If
End Sub


(Obdobný kód se dá najít v souboru od Hav-Rana)

2. Pak je obvykle vhodné při změně velikosti okna upravit velikost a pozici prvků. - událost UserForm_Resize. Strategií a fíglů je docela dost.citovat
#026524
avatar
to Lubo: tohle už je vlídnější na použití. API funkcí je tam výrazně méně 1 . Já jsem ale mezitím objevil příčinu zádrhele v algoritmu od Andy Popa, který jsem našel u Walkenbacha. Tam žádné API funkce nejsou, což beru za velkou přednost toho řešení.
Řešení jsem rozhýbal a pokouším se napsat svoje demo tak, aby ho mohli použít běžní vývojáři, kteří mají z API funkcí hrůzu. Jakmile usoudím, že to může jít do světa, šoupnu to sem na fórum.
Pánové, dík za pomoc!citovat
#026525
avatar
Jak jsem slíbil, jsem tu a se mnou demo v příloze. Obsahuje dva formuáře:
- první z nich jen ukazuje, jak pracuje změna velikosti formuláře na výšku i na šířku. Vnitřní boxy pracují ve třech módech: (1) pevný: box se změnou velikosti formuláře nemění a může být zmenšením formuláře částečně i úplně zakryt, stejně jako se může teprve po zvětšení formuláře objevit; (2)ukotvený: levý horní roh boxu má kotvu, pravý dolní roh se stěhuje spolu s úchytem (box mění velikost); (3) plovoucí: box se stěhuje spolu s úchytem a zachovává si svou velikost.
- druhý formulář mění pouze svou šířku a obsahuje jak ukotvené, tak plovoucí prvky. Formulář je použit pro úlohu FormulaTranslator, která byla předmětem diskuze na fóru před pár dny. Jeho specialitou je skrytí excelské aplikace po dobu zobrazení formuláře.
Demo jsem psal se záměrem zjednodušit život ostatním, kdyby je jim formulář s proměnnou velikostí hodil do krámu
Příloha: zip26525_dynamikform.zip (49kB, staženo 24x)
citovat
icon #026528
eLCHa
Ze srandy jsem to zkusil úplně jednoduše - ranní rozcvička bez API (30minutovka).
Asi to nikdy nepoužiju, takže jsem si to nekomplikoval (např. neošetřuji záporné velikosti prvků - asi bych uložil do Tagu a určitě tam budou další).

Spíše bych se soustředil na Zoom - tedy změnu velikosti formuláře, jeho prvků a velikosti fontů. Ze zvyšováním rozlišení monitorů je to drobné písmo pro některé někdy už opravdu nečitelné - takže jednoduchým roztáhnutím si to uživatel zvětší. Zatím to mám u jednoho uf pomocí checkboxu na 150% - také otázka pár řádků (Userform.Zoom + pár nastavení).
Příloha: zip26528_dynamit.zip (16kB, staženo 25x)
citovat
#026530
avatar
to elCHa: Mě to neskácí, ale pokládám za přirozené, že zaslané sešity fungují. Ten formulář má úplně blbou chybu a už po prostém UserForm1.Show dostanu ránu do čenichu. Alespoň otevřít by se měl!citovat
icon #026532
eLCHa
Prosím?

Mně to neskácí je buď překlep, kterému nerozumím nebo máte pocit, že s Vámi soutěžím. Pokud je to to první, tak prosím přeložte. Pokud to druhé, tak je mi líto, že ten pocit máte, ale asi s tím nic neudělám. Pokud si to přejete, dejte mi prosím vědět a já na Vaše příspěvky tedy reagovat nebudu.

Btw:
Mně to otevřít lze a funguje.citovat
#026538
avatar
@eLCHa

Chybka je v Sub Userform_Initialize()

v řádku
.ZOrder Top

U mne je v Top hodnota 1.5 a to se nelíbí.citovat

Strana:  1 2   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse

Čas od do

lubo • 19.4. 16:30

Makro smyčka

MilanKop • 19.4. 10:46

Makro smyčka

elninoslov • 19.4. 9:02

Čas od do

elninoslov • 19.4. 8:46

Čas od do

jarek1111 • 18.4. 13:46

Čas od do

lubo • 18.4. 11:13

Čas od do

jarek1111 • 18.4. 8:32