Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Заполнение dbGrid [D7, MySQL]


Страницы:   1 2

Andrick ©   (2004-05-25 16:47:00) 

Помогите. Есть dbGrid+ MySQL. Есть апишный проект, в котором результаты запроса должны выдаваться на грид. Но заполнить грид не получается.
Table и Query не подходят - по результатам запроса грид либо виден, либо отсутствует, что через указанные компоненты реализовать не могу. Стринггрид тоже малоприятен, но рассматривался.
Поможите!!!!!


Andrick   (2004-06-02 09:57:00) [1]

А с AppendRecord поможете? Достали огороды


Sandman25   (2004-06-02 08:55:00) [2]

[30] Andrick ©   (02.06.04 06:15)

Я уже начал подозревать, что глюк действительно связан с компонентом. С нестандартными компонентами всегда есть шанс нарваться на неприятность. Хорошо, что хоть исходники есть.


Andrick   (2004-06-02 06:15:00) [3]

Нашел я ошибку, причем не у себя. В исходниках MemTableEh есть процедура SetFieldData, а в ней спрятана процедура

 procedure BufferToVar(var Data: Variant);


Так вот, внутри этой процедуры пропущен признак данных, т.е. стоит
 begin
   case Field.DataType of
     ftString, ftFixedChar, ftGuid:
       Data := String(PChar(Buffer));

вместо
 begin
   case Field.DataType of
     ftString, ftFixedChar, ftGuid:
       Data := String(PChar(Buffer^));

Такие вот пироги.
Единственное, что пока не работает - AppendRecord, приходится идти через огороды


Sandman25   (2004-06-01 17:54:00) [4]

[28] Andrick ©   (01.06.04 17:50)

Тогда вроде бы должно работать. Ведь buf указывает на данные, судя по Вашим ответам. Может, данные неверно отображаются?

PS. Через 10 минут я тоже домой сваливаю


Andrick   (2004-06-01 17:50:00) [5]

Huge string включена - факт. Директивы тоже точно нет.
А вот описание параметров - SetFieldData (Field: TField, buf: pointer [, NativeFofmat: boolean] ). По-моему так. Точнее узнаю только завтра - дома к компу почти не подхожу и проект с собой gjnjve не забираю


Sandman25   (2004-06-01 17:46:00) [6]

что-то мы не туда рулим, ИМХО. Как описаны параметры MemTableEh1.SetFieldData?

Насчет строк - проверьте, что стоит опция Project/Options/Compiler/Huge Strings и что нет директивы $H-


Andrick   (2004-06-01 17:36:00) [7]

При пошаговом на [22] Andrick ©   (01.06.04 17:23) точно выдает строку полностью - проверял, т.е.
buf := AMySQL[0]
buf присваивается абсолютно правильно. И еще. Мой дельфин постоянно ругается на строки, не позволяя присвоить String в AnsiString и т.п. К чему бы это? (Последний раз со строками работал еще в приснопамятном TP, извините)


Sandman25   (2004-06-01 17:30:00) [8]

Не совсем так.
 s := '1234';
 p := @s[1];
 showmessage(p); // выдает 1234
 showmessage(p^); // выдает 1

поэтому [22] Andrick ©   (01.06.04 17:23) нам мало помогает. Нужно узнать, что же находится в AMySQL[0], причем полностью, без ^


Andrick   (2004-06-01 17:28:00) [9]

Прямо сейчас не могу - я дома уже. Но суть понял - похоже, в случае с PChar нужно искусственно преобразовать адрес. Так?
Не пойму, зачем :((((((


Sandman25   (2004-06-01 17:25:00) [10]

Запустите вот это. Тогда поймете, почему я спрашиваю.

procedure TForm1.FormCreate(Sender: TObject);
var p: pchar;
 s: string;
begin
 s := '1234';
 p := @s[1];
 showmessage(p);
 s := p^;
 showmessage(s);
end;


Andrick   (2004-06-01 17:23:00) [11]

Не знаю, не пробовал. Знаю, что кусок программы
var buf: string;
begin
 buf := AMySQLRow[0]^
end;

выдает именно то, что нужно, а именно, строку с данными, а не адрес.


Sandman25   (2004-06-01 17:19:00) [12]

И что мы увидим при ShowMessage(AMySQLRow[0])?


Andrick   (2004-06-01 17:16:00) [13]

AMySQLRow : array of PChar


Sandman25   (2004-06-01 17:14:00) [14]

"указатель на строку"?

AMySQLRow: array ... of PString?
или все-таки array of string?
Если последнее, то нужно @AMySQLRow[i][1]


Andrick   (2004-06-01 17:09:00) [15]

> Тогда мне непонятна строка buf := AMySQLRow[i]
AMySQLRow[i] - это порядковый номер указателя на строку со значением поля.
AMySQLRow - грубо говоря, массив из значений PChar.


Sandman25   (2004-06-01 17:05:00) [16]

Тогда мне непонятна строка buf := AMySQLRow[i]
Какого типа AMySQLRow?
Попробуйте buf := @AMySQLRow[i] (или @AMySQLRow[i][1], если это массив строк).


Andrick   (2004-06-01 16:56:00) [17]

Нет, в SetFieldData buf типа pointer. Я потом в исходниках EhLib перепроверил - он самостоятельно по указанному типу данных преобразует строки. Кстати, SetFieldData в MemTable вообще не доступен - это я его вытащил из protected в public. Окромя этого ничего не делал.


Sandman25   (2004-06-01 14:19:00) [18]

Какого типа buf? Возможно, нужно Form1.MemTableEh1.SetFieldData(..., buf ^, ...)


Andrick   (2004-06-01 12:56:00) [19]

Спасибо за помощь:
 slgeo - за подсказку о компоненте;
 Sandman25+1 - за нашедшуюся подсказку совсем в другом топике ( http://www.delphimaster.ru/cgi-bin/forum.pl?id=1085649670&n=1).
 Грид заполнился, вот только одного понять не могу - где данные? :(( Почему-то вместо данных упорно выдаются их адреса и никакие буфера или преобразования типов не помогают. Кто подскажет?
 Я использую AppendRecord в следующем виде:
 
 for I := 0 to mysql_num_fields(AMySQLRes) - 1 do    // По всем полям базы
       begin
         buf := AMySQLRow[i];  //Считали текущее поле
         Form1.MemTableEh1.SetFieldData(MemTableEh1.Fields[i], buf, false);  //Другая подпрограмма тоже использовалась        
       end;    // for
 

 Поля инициализируются отдельно до заполнения MemTableEh1, потом идет CreateDataSet (спасибо, Sandman25+1), у уж потом указанный цикл. Для простоты в FieldsDef все поля считаю строками PChar или PAnsiChar (это соответствует возвращаемому MySQL значению. В смысле, MySQL через API любые данные возвращает как PChar). Где ошибка?


slgeo   (2004-05-28 09:05:00) [20]


> А любой промежуточный датасет, неважно, будет ли это TClientDataSet
> или его предок, требует для своего открытия заполнения либо
> свойства TableName, либо указания имени провайдера (последнее
> и используется в TADOQuery


В этом вы глубоко ошибаетесь, компонента RxMemoryData,есть подобная и в пакете EhLib, хранит набор данных непосредственно в памяти и не требует никакого провайдера, также как и TClientDataSet, если он работает в локальном режиме (указано имя файла для сохранения таблицы).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо