On-line: Andrey, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник


Пост N: 420
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)


TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений
К примеру

 цитата:

DEFINE TBROWSE oBrw2 ;
AT 60,450 ;
ALIAS cAlias ;
OF Form1 ;
WIDTH 330 ;
HEIGHT 340 ;
FONT "Verdana" ;
SIZE 9 ;
ON DBLCLICK CopyRec();
ON GOTFOCUS fModelo_Hab(2) ;
AUTOFILTER ;
CELLED EDIT;
VALUE nRec;
GRID


Здесь я собрал параметры из разных tBrows
Можно или нет и какие парметры заменить
выражением ( и каким) ?
oBrw2:....
oBrw2:....



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 289 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


администратор




Пост N: 1719
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 14:38. Заголовок: SergKis пишет: Брос..


SergKis пишет:

 цитата:
Брось, может у кого и вылезет чего.


чуть не забыл
 

#include "minigui.ch"
#include "TSBrowse.ch"

static oBrw
static lGo := .f.
static lUp := .t.

PROCEDURE Main
local oWnd, hWnd

SET OOP ON
DEFINE WINDOW Form_0 ;
TITLE "TsBrowse hole test " ;
MAIN ;
NOMAXIMIZE NOSIZE

DEFINE STATUSBAR
STATUSITEM "Item 1" WIDTH 0 FONTCOLOR BLACK
STATUSITEM "Item 2" WIDTH 230 FONTCOLOR BLACK
DATE
CLOCK
KEYBOARD
END STATUSBAR

oWnd := ThisWindow.Object
hWnd := oWnd:Handle()


WITH OBJECT This.Object
:Event( 1, {|w| NIL } )
:Event( 2, {|w| NIL } )
:Event( 4, {|w| nil } )
:Event( 5, {|w| nil } )
:Event( 6, {|w| nil } )
END WITH
END WINDOW


oBrw := CreateBrowse( oWnd )
// Специально за END BROWSE
oBrw:nHeightCell := 22
oBrw:nHeightHead := 22

DEFINE LABEL Label_1
PARENT Form_0
ROW 5
COL 5
WIDTH 80
HEIGHT 16
FONTNAME 'Arial'
FONTSIZE 9
FONTBOLD .F.
VALUE "nHeightCell"
END LABEL

DEFINE SPINNER Spinner_1
PARENT Form_0
ROW 22
COL 2
WIDTH 80
HEIGHT 20
RANGEMIN 10
RANGEMAX 100
VALUE 22
FONTNAME 'Arial'
FONTSIZE 9
TOOLTIP ''
WRAP .T.
ON CHANGE {|| oBrw:nHeightCell := this.value, SecondFunc(oBrw) }
END SPINNER

DEFINE LABEL Label_2
PARENT Form_0
ROW 5
COL 90
WIDTH 80
HEIGHT 16
FONTNAME 'Arial'
FONTSIZE 9
FONTBOLD .F.
VALUE "nHeightHead"
END LABEL

DEFINE SPINNER Spinner_2
PARENT Form_0
ROW 22
COL 90
WIDTH 80
HEIGHT 20
RANGEMIN 10
RANGEMAX 100
VALUE 22
FONTNAME 'Arial'
FONTSIZE 9
TOOLTIP ''
WRAP .T.
ON CHANGE {|| oBrw:nHeightHead := this.value, SecondFunc(oBrw) }
END SPINNER

DEFINE BUTTONEX Button_Go
PARENT Form_0
ROW 12
COL 180
WIDTH 100
HEIGHT 30
ACTION {|| Go() }
CAPTION "Старт"
PICTURE ""
TABSTOP .F.
TOOLTIP ""
FONTNAME "Arial"
FONTSIZE 8
VERTICAL FALSE
FLAT TRUE
END BUTTONEX

DEFINE BUTTONEX Button_Stop
PARENT Form_0
ROW 12
COL 290
WIDTH 100
HEIGHT 30
ACTION {|| lGo := .f. }
CAPTION "Стоп"
PICTURE ""
TABSTOP .F.
TOOLTIP ""
FONTNAME "Arial"
FONTSIZE 8
VERTICAL FALSE
FLAT TRUE
END BUTTONEX


Form_0.Activate

RETURN

FUNCTION SecondFunc(oBrw)
oBrw:Refresh(.t.)
RETURN NIL


FUNCTION Go()

lGo := .t.

While lGo
iF lUp
oBrw:GoDown()
lUp := !obrw:lHitBottom
else
oBrw:GoUp()
lUp := obrw:lHitTop
end
doEvents()
end

Return Nil

FUNCTION CreateBrowse( oWnd )

LOCAL i
LOCAL aDatos := {}

FOR i := 1 TO 1000
AAdd( aDatos, { i, RandStr( 30 ), Date() - i, if( i % 2 == 0, TRUE, FALSE ) } )
NEXT

if isControlDefined( "oBrw", "Form_0" )
doMethod( "Form_0" , "oBrw", "Release")
end

DEFINE TBROWSE oBrw AT 45, 2 ;
OF Form_0 ;
WIDTH oWnd:ClientWidth() - 4 ;
HEIGHT oWnd:ClientHeight() - GetProperty( "Form_0", "StatusBar", "Height" ) - 47 ;
GRID ;
SELECTOR TRUE;
FONT "Arial" SIZE 12

oBrw:SetArray( aDatos, .T. )
oBrw:nWheelLines := 1
oBrw:nClrLine := COLOR_GRID
oBrw:lNoChangeOrd := TRUE
oBrw:lCellBrw := TRUE
oBrw:lNoVScroll := TRUE
oBrw:hBrush := CreateSolidBrush( 242, 245, 204 )


// prepare for showing of Double cursor
AEval( oBrw:aColumns, {| oCol| oCol:lFixLite := oCol:lEdit := TRUE } )

// assignment of column's names
oBrw:aColumns[ 1 ]:cName := "NUMBER"
oBrw:aColumns[ 2 ]:cName := "TEXT"
oBrw:aColumns[ 3 ]:cName := "DATE"
oBrw:aColumns[ 4 ]:cName := "LOGIC"

// the reference to columns by names
oBrw:SetColSize( "NUMBER", 100 )
oBrw:SetColSize( "TEXT", 500 )
oBrw:SetColSize( "DATE", 200 )

// Checking the method nColumn()
oBrw:SetColSize( oBrw:nColumn( "LOGIC" ), 300 )


oBrw:GetColumn( 'NUMBER' ):nAlign := DT_CENTER
oBrw:GetColumn( 'TEXT' ):nAlign := DT_LEFT
oBrw:GetColumn( 'DATE' ):nAlign := DT_CENTER
oBrw:GetColumn( 'LOGIC' ):nAlign := DT_CENTER


oBrw:SetColor( { 1 }, { RGB( 0, 12, 120 ) } )
oBrw:SetColor( { 2 }, { RGB( 242, 245, 204 ) } )
oBrw:SetColor( { 5 }, { RGB( 0, 0, 0 ) } )
oBrw:SetColor( { 6 }, { {|a, b, c| IF( c:nCell == b, { RGB( 66, 255, 236 ), RGB( 111, 183, 155 ) }, ;
{ RGB( 255, 255, 255 ), RGB( 200, 200, 200 ) } ) } } ) // cursor backcolor

END TBROWSE





RETURN oBrw


FUNCTION RandStr( nLen )

LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
LOCAL cPass := ""
LOCAL i := 0

FOR i := 1 TO nLen
cPass += SubStr( cSet, Random( 52 ), 1 )
NEXT

RETURN cPass





Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1720
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 14:40. Заголовок: Dima пишет: Тоже че..


Dima пишет:

 цитата:
Тоже чекну когда время будет.
Желательно +собранный EXE

https://drive.google.com/file/d/11tJqfBppxkPjJwsKvVEcGige6PYExkxR/view?usp=sharing

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7016
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.08.21 16:26. Заголовок: Haz пишет: чуть не ..


Haz пишет:

 цитата:
чуть не забыл


А внизу ТСБ при старте дырка должна быть или нет ?
И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7432
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.21 16:49. Заголовок: Поймал вот :) https:..


Поймал вот :)

Смотрим что имеем в нижней строке
Колесиком мышки так получилось

Andrey пишет:

 цитата:
А внизу ТСБ при старте дырка должна быть или нет ?


У мну есть

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1721
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 17:27. Заголовок: Andrey пишет: А вни..


Andrey пишет:

 цитата:
А внизу ТСБ при старте дырка должна быть или нет


как повезет , никаких противодырочых мер в коде не прописано Можно использовать SetNoHoles для получения дыры, и изменять какую либо из высот. Но вопрос был не в дырке , а поймать залипшую строку. как не пытался , не смог. Дима везунчик ))
Andrey пишет:

 цитата:
И вопрос ещё такой - можно ли в колонку последнюю "виртуальную" что то записать ?


нет, это не виртуальная колонка а продолжение фона бровса. Можно конечно подумать чтоб линии сетки там не рисовались

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1722
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 17:33. Заголовок: Dima пишет: Поймал ..


Dima пишет:

 цитата:
Поймал вот :)

а тут поймаешь ?
https://drive.google.com/file/d/1n5wpp640ryVmHUc3JdQ30Eu1bnrf_keY/view?usp=sharing

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7433
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.21 17:48. Заголовок: Haz пишет: а тут по..


Haz пишет:

 цитата:
а тут поймаешь ?


Да поймал ,на похожей ситуации

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7434
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.21 17:51. Заголовок: А еще вот так вот по..


А еще вот так вот поймал


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1723
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.08.21 17:58. Заголовок: Dima пишет: А еще в..


Dima пишет:

 цитата:
А еще вот так вот поймал

как ты то делаешь ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3821
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.08.21 19:14. Заголовок: Dima пишет: Затем ме..


Dima пишет:
 цитата:
Затем меняю высоту заголовка (произвольно) и тыкаю мышкой посередине бровса
и начинаю скролить колесом мышки.


Для тсб это заведомо аварийная ситуация. По мне, нельзя менять на лету высоты строк и заголовков, т.к. нарушается расчет всей сетки, что рано или поздно приведет к сбою. Высоты надо определять до END TBROWSE и во время работы не трогать, можно поправить за счет дырки, не вылезая за пределы размеров клиентской обл. тсб. В примере после смены высот, надо разрушать и создавать новый тсб. или на main задавать высоты, на след. окне строить тсб

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7017
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.08.21 19:18. Заголовок: Haz пишет: как пове..


Haz пишет:

 цитата:
как повезет , никаких противодырочых мер в коде не прописано Можно использовать SetNoHoles для получения дыры, и изменять какую либо из высот


У меня при старте стразу дырка внизу.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3822
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.08.21 19:28. Заголовок: Andrey пишет У меня ..


Andrey пишет
 цитата:
У меня при старте стразу дырка внизу.


Haz пишет:
 цитата:
никаких противодырочых мер в коде не прописано


сделай
 
oBrw := CreateBrowse( oWnd )
// Специально за END BROWSE
// oBrw:nHeightCell := 22
// oBrw:nHeightHead := 22
...
oBrw:lNoVScroll := TRUE
oBrw:hBrush := CreateSolidBrush( 242, 245, 204 )

oBrw:lNoHScroll := TRUE
oBrw:nHeightCell := 22
oBrw:nHeightHead := 22
...

в тсб поставь в спинер высоту строки 20 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1724
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 12:24. Заголовок: SergKis пишет: в тс..


SergKis пишет:

 цитата:
в тсб поставь в спинер высоту строки 20 и дырки, наверно, не будет (или подбери число). Но если будет сетка не в размер клиентской области, скорее всего, будет затык отображения


Задолбался гонять , конечно при определенных значениях высот есть дырка , но мне она не важна. Меняя высоты эта дырка меняет размеры от 0 до nHeightCell , но все корректно отображается. Из того, что показал Дима ну никак не получить. Тестирую на свежей Win10 за 3 дня так и не поймал артефакты на экране. Затеял все это как раз с целью отказаться в одном из проектов от использования :SetNoHoles() по причине требования соблюдения строгости высот в нескольких таблицах на одном экране. Если , как ты предлагал, использовать SetNoHoles в первом бровсе, а в остальных брать рассчитанные параметры высот, то первый будет без дыры, остальные дырявые ( смысл использования теряется ). Если использовать во всех, то все таблицы будут с разными высотами.
вот пример одного не очень нагруженного экрана https://i.postimg.cc/PxW7ZHm5/Image-1.png
все суперхидеры должны быть одинаковой высоты, все строки, заголовки , подвалы тоже

PS поймал )))) на ситуации когда nHole == nHeightCell -1
теперь есть где искать лекарство

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1725
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 12:49. Заголовок: Haz пишет: PS пойма..


Haz пишет:

 цитата:
PS поймал )))) на ситуации когда nHole == nHeightCell -1
у меня это nHeightCell == 20 , nHeightHead == 13 => nHole = 19 и при вниз-вверх залипуха
теперь есть где искать лекарство


в общем все оказалось просто COUNTROWS() не учитывает что после прорисовки нижней строки нужно место для GridLine. простое добавление пикселя под эту линию проблему залипухи решило.

 
HB_FUNC( COUNTROWS ) // ( hWnd, nHeightCell, nHeightHead, nHeightFoot, nHeightSuper, nHeightSpec ) -> nRows
{
HWND hWnd = ( HWND ) HB_PARNL( 1 );
int iCell = hb_parni( 2 );

int iHead = hb_parni( 3 );
int iFoot = hb_parni( 4 );
int iSupH = hb_parni( 5 );
int iSpcH = hb_parni( 6 );

RECT rct;
int iRows, iFree;

GetClientRect( hWnd, &rct );

iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH - 1;
iRows = iFree / iCell;

hb_retni( iRows );
}



Дима , поймаешь ??
https://drive.google.com/file/d/11tJqfBppxkPjJwsKvVEcGige6PYExkxR/view?usp=sharing

PS проверил. -1 работает правильно при любых заченияз oBrw:nLineStyle

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1726
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 13:46. Заголовок: SergKis пишет: Для ..


SergKis пишет:

 цитата:
Для тсб это заведомо аварийная ситуация. По мне, нельзя менять на лету высоты строк и заголовков, т.к. нарушается расчет всей сетки, что рано или поздно приведет к сбою. Высоты надо определять до END


Сергей, все корректно меняется на лету, даже во время включённого автотеста.
в примере поставил
 
FUNCTION SecondFunc(oBrw)
oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll()
oBrw:Refresh(.t.)
RETURN NIL



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3823
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 14:59. Заголовок: Haz пишет в примере ..


Haz пишет
 цитата:
в примере поставил

FUNCTION SecondFunc(oBrw)
oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll()

oBrw:Refresh(.t.)
RETURN NIL


Про эти команды я уже говорил, ты сбросил расчет прорисовки и сделал новый, повторил по сути команду END TBROWSE.
т.е. делать
 
oBrw := CreateBrowse( oWnd )
// Специально за END BROWSE
oBrw:nHeightCell := 22
oBrw:nHeightHead := 22
...
oBrw:lRePaint := .T.; oBrw:Display(); oBrw:ResetVScroll(); oBrw:Refresh(.t.)

несколько бессмысленно, т.к. повторили END TBROWSE, почему не сделать это до нее. В этом примере да, а в реальных тсб такой необходимости не испытывал, хватало размеры ставить до END

 цитата:
Если , как ты предлагал, использовать SetNoHoles в первом бровсе, а в остальных брать рассчитанные параметры высот, то первый будет без дыры, остальные дырявые ( смысл использования теряется ).


Ты не понял. :SetNoHoles(, .F.) ничего не меняет, дырку не убирает, а возвращает значение этой дырки и ты сам, если надо, раскидываешь ее по заголовкам, получая конкретные значения высот (с дыркой или нет без разницы). Потом, задавая данные высот в др. тсб (одинаковых по высоте) с первого тсб, ты получишь на тсб, например, расположенных вряд горизонтально ровные границы заголовков и строк. Даже если в первом тсб сделать :SetNoHoles(, .T.), убрать дырку и разнести данные высот в др. тсб без выполнения :SetNoHoles() в них, будет тот же результат - высоты заголовков и строк будут одинаковы, т.е. как ты и хотел изначально.

 цитата:
в общем все оказалось просто COUNTROWS() не учитывает что после прорисовки нижней строки нужно место для GridLine. простое добавление пикселя под эту линию проблему залипухи решило.


Это хорошая новость, буду смотреть в своей 7.0 версии. Знаю только, что у меня 1-го пикселя не хватало, т.е. дырка-резерв в 1 пиксел не спасала от залипух, а два пикселя помогли от них избавиться

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3824
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 17:42. Заголовок: Haz пишет лучше так ..


Haz пишет
 цитата:
лучше так проверь


Игорь, спасибо, но как говорит один герой, "Торопиться не будем"
Надо подумать, как все организовать, что бы не сломать что есть.
У меня практически все тсб с Footer и колонкой # и наличие 2 пиксела дырки, визуально дает неплохой вид
границы между строками и подвалом, есть смысл подумать, а надо ли
Это скорее в тсб 9.0 надо довести до ума, что бы было

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3825
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.08.21 19:21. Заголовок: Haz пишет по моему о..


Haz пишет
 цитата:
по моему она лишняя при вычислении области скрола


Не могу сказать, что это строка лишняя, она - это наша дырка, я так понимаю, т.к. скролл делается
по строкам, без учета дырки. Т.е. если nHeightCell := 20, то имеем значение от 0-19, которые не
участвуют в скролле
УПС, куда пост делсяааааааа

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1729
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 20:29. Заголовок: РАЗОБРАЛСЯ


Вобщем разобрался, число строк считается некорректно
смотрим исходник CountRows()
 
HB_FUNC( COUNTROWS ) // ( hWnd, nHeightCell, nHeightHead, nHeightFoot, nHeightSuper, nHeightSpec ) -> nRows
{
HWND hWnd = ( HWND ) HB_PARNL( 1 );
int iCell = hb_parni( 2 );

int iHead = hb_parni( 3 );
int iFoot = hb_parni( 4 );
int iSupH = hb_parni( 5 );
int iSpcH = hb_parni( 6 );

RECT rct;
int iRows, iFree;

GetClientRect( hWnd, &rct );

iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH ;
iRows = iFree / iCell;

hb_retni( iRows );
}

Начнем с того что GetClientRect( hWnd, &rct ) возвращает структуру где nTop и nLeft равны нулю и соонветственно nRight и nBottom содержат ШИРИНУ и ВЫСОТУ ( а не координаты Right и Bottom )
ВОТ ТУТ И ЕСТЬ ОШИБКА
теперь пройдемся по алгоритму с исходными данными


oBrw:nHeightCell == 1
oBrw:nHeightHead == 1
oBrw:nHeightFoot == 1
oBrw:nHeightSuper == 1
oBrw:nHeightSpec == 1

oBrw:nTop == 1
oBrw:nBottom == 6
то есть бровс занимает на экране строки с 1 по 6 ( всего 6 ) и из них
1) заголовки == 3
2) подвал == 1
3) данные == 2

идем по алгоритму
GetClientRect( hWnd, &rct ) заполнит структуру значениями
rct.top == 0
rct.left == 0
rct.right == ширина бровсв ( тут ширина бровса а не координата oBrw:nRight не интересна здесь ) !!!!!!
rct.bottom == 6 ( тут высота бровса , а не координата oBrw:nBottom ) !!!!!!!

далее
iFree = rct.bottom - rct.top + 1 - iSupH - iHead - iFoot - iSpcH
iFree = 6 - 0 +1 - 1 -1 -1 -1
iFree = 3 ЭТО НЕПРАВИЛЬНО должно быть 2
Автор забыл, что GetClientRect() возвращает размеры а не координаты и начал эти размеры высчитывать думая что в структуре rct вернулись координаты
правильно будет так
iFree = rct.bottom - iSupH - iHead - iFoot - iSpcH ( без + 1 и rct.top )

а мы тут всей толпой дырки ищем

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1730
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.08.21 20:41. Заголовок: SergKis пишет: УПС,..


SergKis пишет:

 цитата:
УПС, куда пост делсяааааааа


Серега, прости. Просто начал разбираться и эти посты стали лишними здесь

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 289 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 252
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет