![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заполнение dbGrid [D7, MySQL]
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, если он работает в локальном режиме (указано имя файла для сохранения таблицы).