[Megoldva] Calc-ban több vastagságú keret rajzolása

Táblázatkezelő
Big
Hozzászólások: 4
Csatlakozott: 2014. február 6., csütörtök 12:43

[Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Big »

Üdv!

Olyan keretet kellene rajzolni egyszerűen (lehetőleg egy gombnyomásra), ami több vastagságú vonalból áll. A szélső vonal vastagabb legyen a középső vonalak vékonyak. Próbáltam stílust felvenni (minta alapján), de nem tudja külön értelmezni a kijelölt terület szélét, csak a cellákat tudja a megadott módon formázni. Próbáltam makróval megoldani, de az meg csak körbe tudja keríteni a belső vonalakat nem vastagítja meg, még akkor sem, ha a makróban csak annak a lépése szerepel. (Lehet, hogy a makró rögzítésben van gond?) A makró:

Kód: Egész kijelölése

dim args1(4) as new com.sun.star.beans.PropertyValue
args1(0).Name = "BorderInner.Horizontal"
args1(0).Value = Array(0,0,18,0)
args1(1).Name = "BorderInner.Vertical"
args1(1).Value = Array(0,0,18,0)
args1(2).Name = "BorderInner.Flags"
args1(2).Value = 3
args1(3).Name = "BorderInner.ValidFlags"
args1(3).Value = 127
args1(4).Name = "BorderInner.DefaultDistance"
args1(4).Value = 0

dispatcher.executeDispatch(document, ".uno:BorderInner", "", 0, args1())
 
És ez gyakorlatilag nem csinál semmit. (A makró másik része, ami a külső vonalat húzza működik.)
Mi lehet a megoldás?
Köszönöm!
A hozzászólást 1 alkalommal szerkesztették, utoljára Big 2014. február 7., péntek 11:03-kor.
OpenOffice 4.0.0 Xp - win7
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4084
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Zizi64 »

Olyan keretet kellene rajzolni egyszerűen (lehetőleg egy gombnyomásra), ami több vastagságú vonalból áll. A szélső vonal vastagabb legyen a középső vonalak vékonyak.
Ha jól értem, akkor nem azt kívánod, hogy egy cellának legyen többszörös, különböző vonalvastagsággal rajzolt kerete; hanem egy cellatartomány külső kerete, a belső cellák kerete, és - mondjuk az első sor - eltérő módon legyen keretezve (színezve, formázva, stb.), és az egyszer beállított "stílust" (nevezzük most így) más - akár eltérő nagyságú cellatartományokra is tudd alkalmazni.
Próbáltam stílust felvenni (minta alapján)
Csak "Cellastílust" (és Oldalstílust) tudsz felvenni a Calc-ban, de neked nem ezekre a funkciókra van szükséged nagy valószínűséggel, hanem az "Automatikus formázás"-ra.


Egyszer megcsinálod kézzel a kívánt formázást egy kijelölt (célszerűen legalább 6 sor x 4 oszlop nagyságú) cellatartományon (csinálhatsz eltérő háttérszínű első sort, vastagabb szélső keretet, vékonyabb belsőt - bármit szinte...) Majd kijelölöd ezt a cellatartományt, és
Formátum - Automatikus formázás - Hozzáad - (adsz egy nevet az általad összeállított tulajdonságcsoportnak) - OK

Legközelebb, ha kijelölsz egy még formázatlan tartományt, (ami lehet eltérő méretű és alakú), csak alkalmaznod kell a létrehozott tulajdonságcsoportot a:
Formátum - Automatikus formázás - (kiválasztod az általad összeállított formázáscsoport nevét) - OK

Az egyéni formátumot létrehozhatod a már létező beépített formátum-minták alapján is úgy, hogy alkalmazod valamelyiket egy üres cellatartományra, majd manuális módszerrel módosítod, és aztán felveszed a már leírt módszerrel egy más néven a tulajdonságcsoportok közé.
Automatikus formázás.png
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Big
Hozzászólások: 4
Csatlakozott: 2014. február 6., csütörtök 12:43

Re: Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Big »

Nagyon köszönöm, így már tökéletes. Sikerült egy külön gombra is rátenni, nagyon jó lett. Arra van valami tipped, mi a baja a makrónak?
Köszönöm!
OpenOffice 4.0.0 Xp - win7
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4084
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: [Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Zizi64 »

Kód: Egész kijelölése

dispatcher.executeDispatch(document, ".uno:BorderInner", "", 0, args1())
Itt hivatkozol a "document" objektumra, de nem mondod meg előtte a BASIC értelmezőnek, hogy mi az a "document" objektum. Nem deklarálod sehol.
Úgy látom ez csak egy részlete a teljes eljárásnak és a teljes makrókódnak.

Jó lenne ha a teljes makrót feltennéd ide, akkor tudnék esetleg érdemben foglalkozni vele.

Az első alapvető baj az vele egyébként, hogy ha jól látom ezt a makrórögzítővel vetted fel, és nem az API függvényekre építve ÍRTAD. A makrófelvevő szinte mindenre a diszpécsert használja, ebből gondolom, hogy felvett makróról van szó. A makrófelvevő pedig egy instabil, kísérleti funkció, és nem is képes minden aktivitást rögzíteni.
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Big
Hozzászólások: 4
Csatlakozott: 2014. február 6., csütörtök 12:43

Re: [Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Big »

Igen, csak a "lényeg" volt. A teljes:

Kód: Egész kijelölése

sub keret
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(7) as new com.sun.star.beans.PropertyValue
args1(0).Name = "BorderOuter.LeftBorder"
args1(0).Value = Array(0,0,88,0)
args1(1).Name = "BorderOuter.LeftDistance"
args1(1).Value = 0
args1(2).Name = "BorderOuter.RightBorder"
args1(2).Value = Array(0,0,88,0)
args1(3).Name = "BorderOuter.RightDistance"
args1(3).Value = 0
args1(4).Name = "BorderOuter.TopBorder"
args1(4).Value = Array(0,0,88,0)
args1(5).Name = "BorderOuter.TopDistance"
args1(5).Value = 0
args1(6).Name = "BorderOuter.BottomBorder"
args1(6).Value = Array(0,0,88,0)
args1(7).Name = "BorderOuter.BottomDistance"
args1(7).Value = 0

dispatcher.executeDispatch(document, ".uno:BorderOuter", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(4) as new com.sun.star.beans.PropertyValue
args2(0).Name = "BorderInner.Horizontal"
args2(0).Value = Array(0,0,2,0)
args2(1).Name = "BorderInner.Vertical"
args2(1).Value = Array(0,0,2,0)
args2(2).Name = "BorderInner.Flags"
args2(2).Value = 3
args2(3).Name = "BorderInner.ValidFlags"
args2(3).Value = 127
args2(4).Name = "BorderInner.DefaultDistance"
args2(4).Value = 0

dispatcher.executeDispatch(document, ".uno:BorderInner", "", 0, args2())


end sub
És csak a belső rész nem megy. Valóban a rögzítőt használtam hozzá.
OpenOffice 4.0.0 Xp - win7
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4084
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: [Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Zizi64 »

Volt régebben egy ilyen hiba:
https://issues.apache.org/ooo/show_bug.cgi?id=18035
Nem tudom, hogy valaha javították-e, vagy egy újra visszatérő hibáról van szó...

A link alatt az utolsó kódrészlet egy megkerülő megoldás, ami nálam is működik (az értékeket módosítottam a link alatt lévő kódhoz képest:

Kód: Egész kijelölése

sub Keret 
rem ---------------------------------------------------------------------- 
rem define variables 
dim document   as object 
dim dispatcher as object 
rem ---------------------------------------------------------------------- 
rem get access to the document 
document   = ThisComponent.CurrentController.Frame 
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
 
rem ---------------------------------------------------------------------- 
dim args2(12) as new com.sun.star.beans.PropertyValue 
args2(0).Name = "OuterBorder.LeftBorder" 
args2(0).Value = Array(0,0,50,0) 
args2(1).Name = "OuterBorder.LeftDistance" 
args2(1).Value = 0 
args2(2).Name = "OuterBorder.RightBorder" 
args2(2).Value = Array(0,0,50,0) 
args2(3).Name = "OuterBorder.RightDistance" 
args2(3).Value = 0 
args2(4).Name = "OuterBorder.TopBorder" 
args2(4).Value = Array(0,0,50,0) 
args2(5).Name = "OuterBorder.TopDistance" 
args2(5).Value = 0 
args2(6).Name = "OuterBorder.BottomBorder" 
args2(6).Value = Array(0,0,50,0) 
args2(7).Name = "OuterBorder.BottomDistance" 
args2(7).Value = 0 
args2(8).Name = "InnerBorder.Horizontal" 
args2(8).Value = Array(0,0,2,0) 
args2(9).Name = "InnerBorder.Vertical" 
args2(9).Value = Array(0,0,2,0) 
args2(10).Name = "InnerBorder.Flags" 
args2(10).Value = 1 
args2(11).Name = "InnerBorder.ValidFlags" 
args2(11).Value = 127 
args2(12).Name = "InnerBorder.DefaultDistance" 
args2(12).Value = 0 
 
dispatcher.executeDispatch(document, ".uno:SetBorderStyle", "", 0, args2()) 
 
end sub


Egyébként API függvényekkel (nem makrórögzítővel) így lehetne megoldani (de ez sem működik sem a LO4.0.6-ban, sem az AOO4.0.1-ben nálam.):

https://forum.openoffice.org/en/forum/v ... =5&t=34875
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4084
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: [Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Zizi64 »

No megfejtettem az API függvényhívós megoldást (nálam működik is):

Kód: Egész kijelölése

Sub Keret
   Dim oRange As Object
   oRange = ThisComponent.getCurrentSelection() REM a formázandó cellatartomány legyen az ami éppen ki van jelölve 
   REM de megadhatnánk fix koordinátákkal is, hogy mit kell keretezni...
   DrawBorderForRange(oRange) REM adjuk át a paramétert a keretező rutinnak
End Sub


Sub DrawBorderForRange( oRange As Object ) 
REM a keretezendő tábla koordinátái paraméterként érkeznek a szubrutinba a "Keret" szubrutinból


   Dim aTableBorder As New com.sun.star.table.TableBorder
   Dim aBorder, vBorder, hBorder
   
REM a külső keret vonaljellemzőit állítjuk itt be:
   aBorder = createUnoStruct("com.sun.star.table.BorderLine")
   With aBorder
       .Color = 0           REM a színeket az R,G,B = 0-255, 0-255, 0-255 kombináció decimális értéke adja
       .OuterLineWidth = 0
       .InnerLineWidth = 100
       .LineDistance = 0
   End With

 
REM a belső függőleges (Vertikális) keret vonaljellemzőit állítjuk itt be:   
    vBorder = createUnoStruct("com.sun.star.table.BorderLine")
    With vBorder
       .Color = 255           REM a színeket az R,G,B = 0-255, 0-255, 0-255 kombináció decimális értéke adja
       .OuterLineWidth = 0
       .InnerLineWidth = 50
       .LineDistance = 0       
   End With

REM a belső vízsuintes (Horizontális) keret vonaljellemzőit állítjuk itt be:    
    hBorder = createUnoStruct("com.sun.star.table.BorderLine")
    With hBorder
       .Color = 16711680          REM a színeket az R,G,B = 0-255, 0-255, 0-255 kombináció decimális értéke adja
       .OuterLineWidth = 0
       .InnerLineWidth = 10 
       .LineDistance = 0       
   End With

   With aTableBorder REM : akkor most nézzük a formázandó tábla komponenseit
      .TopLine = aBorder REM a felső vonal legyen "aBorder" típusú
      .RightLine = aBorder REM a jobb oldali vonal legyen "aBorder" típusú
      .BottomLine = aBorder REM az alsó vonal legyen "aBorder" típusú
      .LeftLine = aBorder REM az bal oldali vonal legyen "aBorder" típusú
      .VerticalLine = vBorder REM a belső függőleges vonalak legyenek "vBorder" típusúak
      .HorizontalLine = hBorder REM a belső vízszintes vonalak legyenek "hBorder" típusúak
      .Distance = 0
      .IsTopLineValid = True REM kapcsoljuk is be a felső vonalat
      .IsRightLineValid = True REM kapcsoljuk is be a jobb oldali vonalat
      .IsBottomLineValid = True REM kapcsoljuk is be az alsó vonalat
      .IsLeftLineValid = True REM kapcsoljuk is be a bal oldali vonalat
      .IsHorizontalLineValid = True REM kapcsoljuk is be a vízszintes vonalakat
      .IsVerticalLineValid = True REM kapcsoljuk is be a függőleges vonalakat
   End With

   oRange.TableBorder = aTableBorder REM adjuk ki a végrehajtási parancsot
End Sub
Tehát itt is KÜLÖN meg kell adni a belső horizontális/vertikális vonalak típusát. Tehát az inner/outer paraméter nem a cellatartomány külső keretét, és a belső vonalakat jelenti, hanem valószínűleg egyetlen cella esetén a dupla vonallal keretezett megoldást jelenti. Ezt még nem sikerült "bebizonyítanom"...
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Big
Hozzászólások: 4
Csatlakozott: 2014. február 6., csütörtök 12:43

Re: [Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Big »

Tökéletes, nagyon köszönöm a segítséget!
OpenOffice 4.0.0 Xp - win7
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4084
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: [Megoldva] Calc-ban több vastagságú keret rajzolása

Hozzászólás Szerző: Zizi64 »

Örülök, hogy tudtam segíteni!
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
Válasz küldése