Встречал кто-нибудь коммерческий или бесплатный компонент типа инспектора с "нормальным" автоматическим изменением высоты полей? То есть надо вводить различные данные в таблицу из двух колонок и кучей строк, в которой левая колонка заголовок, а правая различные редакторы (в том числе и Memo).
Сейчас пользуюсь cxVerticalGrid, но он к сожалению имеет слегка необычное поведение, которое меня неустраивает.. Он не учитывает высоту скрытых полей и при скроллировании скроллбар прыгает как сумашедший..
Здравствуйте, Dimonka, Вы писали:
D>Всем доброго времени суток. D>Ищу компонент
D>Встречал кто-нибудь коммерческий или бесплатный компонент типа инспектора с "нормальным" автоматическим изменением высоты полей? То есть надо вводить различные данные в таблицу из двух колонок и кучей строк, в которой левая колонка заголовок, а правая различные редакторы (в том числе и Memo).
D>Сейчас пользуюсь cxVerticalGrid, но он к сожалению имеет слегка необычное поведение, которое меня неустраивает.. Он не учитывает высоту скрытых полей и при скроллировании скроллбар прыгает как сумашедший..
D>Может кто подкинет мысль?
Не прячь поля, попробуй их из грида удалять на пример в какой то список, а потом если надо возвращай обратно.
Думаю вряд ли ты найдеш что то лучше чем cxVerticalGrid.
Здравствуйте, Danchik, Вы писали:
D>Не прячь поля, попробуй их из грида удалять на пример в какой то список, а потом если надо возвращай обратно.
Суть не в этом — я их не прячу.
Под скрытыми полями подразумеваются поля, которые не поместились на экране за раз.
Т.е. если проскроллировать там находятся большие Memo поля, но пока они невидимы на экране — Grid считает их достаточно небольшими.. В этом вся проблема..
D>Думаю вряд ли ты найдеш что то лучше чем cxVerticalGrid.
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, Danchik, Вы писали:
D>>Не прячь поля, попробуй их из грида удалять на пример в какой то список, а потом если надо возвращай обратно. D>Суть не в этом — я их не прячу. D>Под скрытыми полями подразумеваются поля, которые не поместились на экране за раз. D>Т.е. если проскроллировать там находятся большие Memo поля, но пока они невидимы на экране — Grid считает их достаточно небольшими.. В этом вся проблема..
D>>Думаю вряд ли ты найдеш что то лучше чем cxVerticalGrid.
D>печально это слышать..
Решал когда то проблемы со скроллированием в cxVerticalGrid, но мне нужен сампл где это повторяется. Просто напиши маленький тест. Брось на формочку один грид и кнопочку заполнить грид. Запости DFM-текст и PAS файл. Я гляну что там у тебя не так.
D>Сейчас пользуюсь cxVerticalGrid, но он к сожалению имеет слегка необычное поведение, которое меня неустраивает.. Он не учитывает высоту скрытых полей и при скроллировании скроллбар прыгает как сумашедший..
А просто cxGrid не пробовал? А уж сделать на основе его инспектор ерунда...
Здравствуйте, Demiurg, Вы писали:
D>Здравствуйте, Dimonka, Вы писали:
D>>Сейчас пользуюсь cxVerticalGrid, но он к сожалению имеет слегка необычное поведение, которое меня неустраивает.. Он не учитывает высоту скрытых полей и при скроллировании скроллбар прыгает как сумашедший..
D> А просто cxGrid не пробовал? А уж сделать на основе его инспектор ерунда...
Совсем даже не ерунда. Попробуй сделать вложеность — начнеш балдеть.
Это что постоянно Levels создавать и динамические Views? Помоему проще багу в вертикальном гриде найти и профиксать
uses cxMemo;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Row: TcxEditorRow;
S: string;
k, l: Integer;
begin
cxVG.BeginUpdate;
cxVG.ClearRows;
cxVG.OptionsView.CellAutoHeight := true;
for I := 0 to 20 do// Iteratebegin
Row := cxVG.Add(TcxEditorRow) as TcxEditorRow;
Row.Properties.EditPropertiesClass := TcxMemoProperties;
Row.Properties.Caption := format('Row %d', [i]);
s:='';
l:= Random(30) + (i * 20) * (i and 1);
for k := 0 to l do// Iterate
s:= s + 'Demo ';
Row.Properties.Value := s;
end; // for
cxVG.EndUpdate;
end;
Экстремального случая изобразить на скорую руку не получилось, но, надеюсь смысл понятен..
Для теста — кинуть грид по имени cxVG, кинуть кнопку и добавить код.
D>uses cxMemo;
D>{$R *.dfm}
D>procedure TForm1.Button1Click(Sender: TObject);
D>var
D> I: Integer;
D> Row: TcxEditorRow;
D> S: string;
D> k, l: Integer;
D>begin
D> cxVG.BeginUpdate;
D> cxVG.ClearRows;
D> cxVG.OptionsView.CellAutoHeight := true;
D> for I := 0 to 20 do// Iterate
D> begin
D> Row := cxVG.Add(TcxEditorRow) as TcxEditorRow;
D> Row.Properties.EditPropertiesClass := TcxMemoProperties;
D> Row.Properties.Caption := format('Row %d', [i]);
D> s:='';
D> l:= Random(30) + (i * 20) * (i and 1);
D> for k := 0 to l do// Iterate
D> s:= s + 'Demo ';
D> Row.Properties.Value := s;
D> end; // for
D> cxVG.EndUpdate;
D>end;
D>
D>Экстремального случая изобразить на скорую руку не получилось, но, надеюсь смысл понятен..
D>Для теста — кинуть грид по имени cxVG, кинуть кнопку и добавить код.
Я так понял тебе не нравится что ScrollBar меняет свою высоту во время скроллирования?
Это тебя сильно неустраивает? Я такой же тест прогнал на cxGrid — поведение идентичное.
Здравствуйте, Danchik, Вы писали:
D>Я так понял тебе не нравится что ScrollBar меняет свою высоту во время скроллирования? D>Это тебя сильно неустраивает? Я такой же тест прогнал на cxGrid — поведение идентичное.
Проблема в том, что в экстремальных случаях (а я с ними постоянно сталкиваюсь) совершенно невозможно управлять позицированием из-за того, что курсор находится вне грида и зачастую из-за этого грид теряет фокус. Короче — вопервых очень раздражает, а во-вторых выглядит совершенно непрофессионально.
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, Danchik, Вы писали:
D>>Я так понял тебе не нравится что ScrollBar меняет свою высоту во время скроллирования? D>>Это тебя сильно неустраивает? Я такой же тест прогнал на cxGrid — поведение идентичное.
D>Проблема в том, что в экстремальных случаях (а я с ними постоянно сталкиваюсь) совершенно невозможно управлять позицированием из-за того, что курсор находится вне грида и зачастую из-за этого грид теряет фокус.
Брр, стоп. Ка это курсор вне грида? Во время редактирования что ли? Изза чего он теряет фокус ?
Здравствуйте, Danchik, Вы писали:
D>>Проблема в том, что в экстремальных случаях (а я с ними постоянно сталкиваюсь) совершенно невозможно управлять позицированием из-за того, что курсор находится вне грида и зачастую из-за этого грид теряет фокус. D>Брр, стоп. Ка это курсор вне грида? Во время редактирования что ли? Изза чего он теряет фокус ?
Когда скроллируешь грид к нижним строкам курсор уезжает ниже скроллбара и может вообще уйти за окно, а позиция в строках грида будет в это время где-нибудь на середине. Неужели не заметил? Попробуй проскроллировать одним махом до низа. В моём примере это хоть и не сильно, но всё же проявляется.
Здравствуйте, Dimonka, Вы писали:
D>Здравствуйте, Danchik, Вы писали:
D>>>Проблема в том, что в экстремальных случаях (а я с ними постоянно сталкиваюсь) совершенно невозможно управлять позицированием из-за того, что курсор находится вне грида и зачастую из-за этого грид теряет фокус. D>>Брр, стоп. Ка это курсор вне грида? Во время редактирования что ли? Изза чего он теряет фокус ?
D>Когда скроллируешь грид к нижним строкам курсор уезжает ниже скроллбара и может вообще уйти за окно, а позиция в строках грида будет в это время где-нибудь на середине. Неужели не заметил? Попробуй проскроллировать одним махом до низа. В моём примере это хоть и не сильно, но всё же проявляется.
Понял. Нужно кункретно подебажить. На днях дам ответ. А пока кликай в начало ScrollBars's Thumbnail, мышка будет держатся
Только изза этого совсем не обязательно отказываться от грида
Здравствуйте, Danchik, Вы писали:
D>Понял. Нужно кункретно подебажить. На днях дам ответ. А пока кликай в начало ScrollBars's Thumbnail, мышка будет держатся D>Только изза этого совсем не обязательно отказываться от грида
Довёл свой пример до совершенства
uses cxMemo;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Row: TcxEditorRow;
S: string;
k, l: Integer;
begin
cxVG.BeginUpdate;
cxVG.ClearRows;
cxVG.OptionsView.CellAutoHeight := true;
for I := 0 to 30 do// Iteratebegin
Row := cxVG.Add(TcxEditorRow) as TcxEditorRow;
Row.Properties.EditPropertiesClass := TcxMemoProperties;
Row.Properties.Caption := format('Row %d', [i]);
s:='';
if i > 15 then
begin
l:= (i * 5) * (i and 1);
for k := 0 to l do// Iterate
s:= s + 'Demo ';
end;
Row.Properties.Value := s;
end; // for
cxVG.EndUpdate;
end;
Как получить максимально гдакий эффект — после выполнения вышеприведённого заполнения надо взяться за нижнюю (!) часть тушки скроллбара и потянуть вниз. Эффект просто охренетительный.
Из дополнительных претензий к VerticalGrid — это отсутствие автоматического изменения высоты строк при вводе текста. Т.е. вместо того, чтобы добавить новую строку при редактировании текст начинает уползать вверх..AutoHeight не работает во время редактирования.. Можно конечно сделать видимым скроллбар.. но это уж совсем извращение на мой взгляд..
Все проблема, так сказать solved
Алгоритм такой: если мышка вылезла за рамки ролика вниз — просто ставим ролик так чтобы мышка была посредине.
Перепиши к себе в проэкт юнит cxScrollBar.pas. Тут нужно в прцедуре TcxScrollBar.MouseMove добавить две строчки (подсвечно болдом):
procedure TcxScrollBar.MouseMove(Shift: TShiftState; X, Y: Integer);
....
begin
...
if FKind = sbHorizontal then
begin
ADelta := X - FDownMousePos.X;
if ADelta = 0 then Exit;
if (ADelta < 0) and (FSaveThumbnailPos.X + ADelta < FTopLeftArrow.Right) then
ADelta := FTopLeftArrow.Right - FSaveThumbnailPos.X
else
if (ADelta > 0) and (FSaveThumbnailPos.X + ASize + ADelta > FBottomRightArrow.Left) then
ADelta := FBottomRightArrow.Left - (FSaveThumbnailPos.X + ASize);
UpdateThumbnail(ADelta, 0);
end
else
beginif FThumbnail.Top + ASize < Y then
FDownMousePos.Y := FSaveThumbnailPos.Y + ASize div 2; // middle of thumbnail
ADelta := Y - FDownMousePos.Y;
if ADelta = 0 then Exit;
if (ADelta < 0) and (FSaveThumbnailPos.Y + ADelta < FTopLeftArrow.Bottom) then
ADelta := FTopLeftArrow.Bottom - FSaveThumbnailPos.Y
else
if (ADelta > 0) and (FSaveThumbnailPos.Y + ASize + ADelta > FBottomRightArrow.Top) then
ADelta := FBottomRightArrow.Top - (FSaveThumbnailPos.Y + ASize);
UpdateThumbnail(0, ADelta);
end;
...
end;
Enjoy!
D>Из дополнительных претензий к VerticalGrid — это отсутствие автоматического изменения высоты строк при вводе текста. Т.е. вместо того, чтобы добавить новую строку при редактировании текст начинает уползать вверх..AutoHeight не работает во время редактирования.. Можно конечно сделать видимым скроллбар.. но это уж совсем извращение на мой взгляд..
Это сделаем в следующем номере нашей газеты
Здравствуйте, Dimonka, Вы писали:
D>Пришёл ответ по поводу этих вопросов от саппорта.. D>Как говориться — всё знаем, но ничего поделать не можем. Пометили себе, так сказать, на будущее..
Хе-хе
Пока от них дождешся...
Я всегда сам правлю. Заодно разберусь как что и куда.
Только не думай что это единстванный баг
(offtopic) Помнится Report Builder фиксал, послал им письмецо, что, где, куда и почему. Что удивительно — ответили, поинтересовались откуда это я столько нарыл, кто ихнюю тайну кода расскрыл. BTW в селующей версии все мои поправки били аккуратно вставлены