Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Вывод поля MEMO в TDBGrid


Автор: Rodman 4.7.2007, 11:47
Дароф..

Раньше не пробовал, но вот как сделать чтобы в DGrid выводилось содержимое поля типа Memo, то там только надпись (MEMO)???

Сенкс

Автор: Akella 12.7.2007, 15:10
используй TDBGridEh

Автор: Aprol 19.7.2007, 04:02
А этот компонент из какой библиотеки?

Автор: Akella 19.7.2007, 14:10
EhLib

Автор: Rodman 21.8.2007, 08:47
в DRKB нашел 
Код

{ A common problem when working with DBGrid is, that this component can't display TMemo fields,
multiline columns, Graphics...
There are a few good freeware components around to solve this problem.
The best one is definitly "DBGRIDPLUS", which comes with full sources.
However, this component does not allow to edit the text in memo fields.
The delphi fans out there who bought a delphi version that comes with the VCL sources can
fix this problem:
Open dbgrids.pas and make the following changes:
(To have memo editing in your app you must just add the modifyed version of dbgrids.pas to your uses clause)}

function TCustomDBGrid.GetEditLimit: Integer;
begin
   Result := 0;
   if Assigned(SelectedField) and (SelectedField.DataType in [ftString, ftWideString, ftMemo]) then// <-- Add
      Result := SelectedField.Size;
end;

function TCustomDBGrid.GetEditText(ACol, ARow: Longint): string;
begin
   Result := '';
   if FDatalink.Active then
      with Columns[RawToDataColumn(ACol)] do
         if Assigned(Field) then
             Result := Field.AsString;// <-- Change this.
   FEditText := Result;
end;

{Just compare theese edited functions with the original ones, and you will know what to change.
To get multiline cell support (not in memo fields!) for DBGridPlus, send me an email and i can send you the changed DBGridPlus.pas file.}


но я вписал изменения, и никакого эффекта... что не так?

Автор: pseud 21.8.2007, 09:46
вот что нам говорит об этом Delphi World 6 Pro

 обработчик события GetText TMemoField поместите следующую строку:
Код

Text := GrabMemoAsString(TMemoField(Sender)); 

и поместите следующую функцию так, чтобы к ней можно было свободно обратиться:
Код

function GrabMemoAsString(TheField: TMemoField): string;
begin
  if TheField.IsNull then
    Result := ''
  else
    with TBlobStream.Create(TheField, bmRead) do
    begin
      if Size >= 255 then
      begin
        Read(Result[1], 255);
        Result[0] := #255;
      end
      else
      begin
        Read(Result[1], Size);
        Result[0] := Chr(Size);
      end;
      Free;
      while Pos(#10, Result) > 0 do
        Result[Pos(#10, Result)] := ' ';
      while Pos(#13, Result) > 0 do
        Result[Pos(#13, Result)] := ' ';
    end;
end;



Автор: Rodman 23.8.2007, 16:43
Цитата(pseud @  21.8.2007,  09:46 Найти цитируемый пост)
обработчик события GetText TMemoField поместите следующую строку:

я не понял, куда ее вставить?

Автор: pseud 23.8.2007, 17:18
В своем DataSet'е создай New поле типа Memo
в инспекторе в методах у него есть метод OnGetText
туда видимо

Автор: Rodman 5.9.2007, 08:54
pseud, мож попробовать у себя, а то что то у меня не выходит!

Автор: pseud 5.9.2007, 19:00
Rodman
статью нашел - а не проверял
попробовал этот пример заточить у себя - что-то не выходит, ошибки валят
пока не могу разобраться

попробовал TdxDBGrid (Developer Express)
прекрасно работает:
ничего руками писать не надо
сам отображает это мемо поле как текст
а если выставить автовеличину строки, то и с ентерами отображает

надо бы залезть в исходники TdxDBGrid, но позже, извини

Автор: Akella 10.9.2007, 15:41
DrawMemoText := true;

Автор: KaRTmaN 10.9.2007, 17:11
У меня такая же проблема.

Автор: Akella 11.9.2007, 08:04
KaRTmaN, какая именно?

Автор: Rodman 11.9.2007, 11:01
установил все таки ЁhLib...

но как быть теперь с "палками" (||) вместо ENTER в гриде... 

как их убрать - в идеале заменить на ENTER???

Автор: Akella 11.9.2007, 12:36
если ты уберешь перевод строки, то уже не тот результат будет

Добавлено через 1 минуту и 46 секунд
можно попробовать при выводе, в событии DataSet.OnGetText удалять эти строки типа

Text := StringReplace(Field.value, #13, '', [оба параметра])
или
Text := StringReplace(Field.value, #13#10, '', [оба параметра])

Добавлено через 8 минут и 2 секунды
странно
Код

procedure TForm1.ADOQuery1NameTestGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
//  ShowMessage(Sender.Value);
  Text := StringReplace(Sender.Value, #$D#$A, '', [rfReplaceAll, rfIgnoreCase]);
  ShowMessage(Text); <- выводит нормальный текст, а в гриде, все равно палки
end;



Добавлено через 9 минут и 34 секунды
но теперь, после StringReplace, нужно DrawMemoText установить в false;

Добавлено через 10 минут и 29 секунд
только что потом будет при записи значения поля из грида в таблицу......

Автор: Akella 11.9.2007, 13:02
ну и конечно же нужно проверять Sender.Value на то, чтобы это значение не было null

Автор: Rodman 11.9.2007, 14:35
в этом примере впихнул все методы этого топика...

ругаться начал.

что случилось?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)