??? вместо текста

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

??? вместо текста

Сообщение Elena » 11.05.2012 19:12:57

Прочла в одной из тем форума, как можно переделать ???, читаемые из базы Access в текст. Ответ был таков.

Код: Выделить всё
procedure TForm1.AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
begin
   AText:=ansiToUTF8(Sender.AsString);
end;

procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
var i:Integer;
begin
  for i:=0 to SQLQuery1.Fields.Count-1 do
    if SQLQuery1.Fields[i].DataType=ftString then
      SQLQuery1.Fields[i].OnGetText:=@AllText;
end;     



Объясните, пожалуйста, откуда взялась эта функция AllText.
Elena
новенький
 
Сообщения: 29
Зарегистрирован: 02.05.2012 20:35:37

Re: ??? вместо текста

Сообщение Ism » 11.05.2012 20:13:59

Эта функция цепляется к событию отображения , ее надо задекларировать в описании формы
TFormMain = class(TForm)
AllText(Sender: TField; var AText: string; DisplayText: Boolean);
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: ??? вместо текста

Сообщение Elena » 13.05.2012 20:01:17

Что значит цепляется к событию отображения?
Задекларировать задекларировала.
Теперь пишет ошибку указывая на процедуру class identifier expected.
Elena
новенький
 
Сообщения: 29
Зарегистрирован: 02.05.2012 20:35:37

Re: ??? вместо текста

Сообщение Ism » 13.05.2012 21:05:38

Вот это работает viewtopic.php?f=5&t=7065

Код: Выделить всё
uses lconvencoding;

{ TForm1 }

procedure TForm1.DbFieldGetText(Sender: TField; var aText: string;
  DisplayText: Boolean);
begin
  aText:=CP866ToUTF8(Sender.AsString);
end;

procedure TForm1.DbFieldSetText(Sender: TField; const aText: string);
begin
  Sender.AsString:=UTF8ToCP866(aText);
end;

procedure TForm1.DbAfterOpen(DataSet: TDataSet);
var i: Integer;
begin
  for i:=0 to DataSet.FieldCount-1 do
    if DataSet.Fields[i].DataType in [ftString, ftMemo, ftFixedChar] then
    begin
      DataSet.Fields[i].OnGetText:=@DbFieldGetText;
      DataSet.Fields[i].OnSetText:=@DbFieldSetText;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  for i:=0 to ComponentCount-1 do
    if Components[i] is TDataSet then
    begin
      (Components[i] as TDataSet).AfterOpen:=@DbAfterOpen;
      if (Components[i] as TDataSet).Active then
        DbAfterOpen(Components[i] as TDataSet);
    end;
end;
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: ??? вместо текста

Сообщение v-t-l » 13.05.2012 21:50:07

Ism писал(а):Эта функция цепляется к событию отображения , ее надо задекларировать в описании формы
TFormMain = class(TForm)
AllText(Sender: TField; var AText: string; DisplayText: Boolean);

Код: Выделить всё
TFormMain = class(TForm)
private
...
  procedure AllText(Sender: TField; var AText: string;  DisplayText: Boolean);

Ism писал(а):Вот это работает viewtopic.php?f=5&t=7065

Только для MS Access наверно CP1251ToUTF8 или UTF8Encode.
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: ??? вместо текста

Сообщение Ism » 14.05.2012 01:00:45

Какие функции пропишешь так и конвертить будет
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: ??? вместо текста

Сообщение Elena » 14.05.2012 09:21:59

вписала
procedure AllText(Sender: TField; var AText: string; DisplayText: Boolean);
после private и заработало)

Код: Выделить всё
procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
var i:Integer;
begin
  SQLQuery1.First;
while not SQLQuery1.EOF do
Begin
   for i:=0 to SQLQuery1.Fields.Count-1 do
      if SQLQuery1.Fields[i].DataType in [ftMemo, ftString] then
         begin
         SQLQuery1.Fields[i].OnGetText:=@AllText;
        end;
     SQLQuery1.Next;
end;
end;

procedure TForm1.AllText(Sender: TField; var AText: string;  DisplayText: Boolean);
begin
   AText:=ansiToUTF8(Sender.AsString);
end;


Только он теперь все текстовые поля кодирует, а Мемо не хочет. Он их перебирает, но ничего с нимо не делает.
НЕ знаете почему?
Elena
новенький
 
Сообщения: 29
Зарегистрирован: 02.05.2012 20:35:37

Re: ??? вместо текста

Сообщение v-t-l » 14.05.2012 17:51:27

А это зачем?!!
Elena писал(а):
Код: Выделить всё
SQLQuery1.First;
while not SQLQuery1.EOF do
Begin
...
     SQLQuery1.Next;
end;


Elena писал(а):Только он теперь все текстовые поля кодирует, а Мемо не хочет. Он их перебирает, но ничего с нимо не делает.

А он с нимо и не должен ничего делать :D. Видно, он(?) читает поля другим способом (CreateBLOBStream/LoadFromStream), без вызова обработчика события OnGetText. :D

Добавлено спустя 4 минуты 9 секунд:
Или, все таки, DataType у этих полей не попадает в [ftMemo, ftString].
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: ??? вместо текста

Сообщение Elena » 20.05.2012 20:40:45

При чтении менять кодировку я не стала, поняла, что если создавать новые строки в проекте, то они и читаются правильно, а не ?.
Это сработала со всеми строками, кроме Мемо(
Мемо поля записываются в базу как то по другому. Если открыть Аксесс, то видно, что текстовые поля одними иероглифами, а Мемо совсем другими, поэтому и в проекте отображаются по прежнему (?).

Пыталась, при отображении данных все оставлять без изменений, а Мемо

Код: Выделить всё
dBMemo1.Caption:=AnsitoUtf8(form1.SQLQuery1.FieldByName('Opisanie').AsString);

Ничего не помогло.
Все равно в нем ?????????

Расскажите, пожалуйста, как работать с Мемо полями.
Elena
новенький
 
Сообщения: 29
Зарегистрирован: 02.05.2012 20:35:37

Re: ??? вместо текста

Сообщение Ism » 20.05.2012 21:59:30

Забейте на Access, Конвертируйте в нормальную базу. Ибо то, что вы делаете, большое извращение
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 235

Рейтинг@Mail.ru
cron