заповнення dbgrid

заповнення dbGrid

Допоможіть. Є dbGrid + MySQL. Є апішний проект, в якому результати запиту повинні видаватися на грід. Але заповнити грід не виходить.
Table і Query не підходять - за результатами запиту грід або видно, або відсутній, що через зазначені компоненти реалізувати не можу. Стрінггрід теж малопріятен, але розглядався.
Допоможемо.

> За результатами запиту грід або видно, або відсутній

DBGrid.Visible: = Table.Active and (Table.RecordCount> 0)

За видимість спасибі, але як і раніше бажано ручне заповнення dbGrid "а. А ще краще вклинитися між зв'язкою TAdoQuery і TDataSource (необхідно перевіряти деякі параметри і можливо, ресортіровать дані в необхідний формат виведення)

Ручне заповнення DBGrid означає, що використовується StringGrid, в циклі йде пробіг по всіх записів, а для кожного запису пробіг по всім полям. Воно вам треба?

Формат виведення полів можна задавати або в Field.OnGetText, або в DBGrid.OnDrawColumnCell

Заведіть буферний DataSet в пам'яті (наприклад, TClientDataSet, або що-небудь на зразок kbmMemTable, RxMemoryData.) Заповнюйте його вручну чим хочете і показуйте в DBGrid-е

А чим конкретно можна заповнити цей проміжний датасета?
Всі інші варіанти і їжаку зрозумілі.
Щодо ресортіровкі - не завжди вдається створити такий Select, який повністю відповідає формату виведення в грід (використовується MySQL 3.23), тому необхідно реорганізовувати дані, наприклад, піднімати рядки в стовпці. А безпосередньо формат (в сенсі даних в осередках) міняти поки не треба (це легко робиться при ручному заповненні). До того ж бажана повна працездатність гріда (тобто його звичайна функціональність, як до зміни).
І як я вже говорив, ручне заповнення СтрінгГріда - вже пройдений етап (і тому ізнічтоженія)

Забути про бази даних.

> А чим конкретно можна заповнити цей проміжний датасета?

Якщо це нащадок TDataSet - то всім тим, з чим вміє поводитися TDataSet

> Щодо ресортіровкі - не завжди вдається створити такий Select, який повністю відповідає формату виведення в грід (використовується MySQL 3.23), тому необхідно реорганізовувати дані, наприклад, піднімати рядки в стовпці.

Можна в run-time створити потрібні поля, потім заповнити. І сортування у TClientDataSet і RxMemoryData є

> Бажана повна працездатність гріда (тобто його звичайна функціональність, як до зміни).

А куди ж вона дінеться :) Або Ви хочете редагувати дані буферного dataset-а, і щоб зміни потрапляли в базу? І це можна зробити - так хоча б в обробнику AfterPost


>> А чим конкретно можна заповнити цей проміжний датасета?
>
> Якщо це нащадок TDataSet - то всім тим, з чим вміє поводитися
> TDataSet

А команди може хто-небудь підказати? Я вже тижнів зо два б'юся - проект пишеться на MySQL API і Делфі, все підключення виконуються через mysql_connect без допомоги BDE, що виключає використання будь-яких стандартних або сторонніх TTable, TQuery і іншого. Єдиний виняток - TAdoQuery (використовується ODBC-драйвер). А будь-який проміжний датасета, неважливо, чи буде це TClientDataSet або його предок, вимагає для свого відкриття заповнення або властивості TableName, або вказівки імені провайдера (останнє і використовується в TADOQuery;))))). Але навіть допоміжний датасета при завданні імені провайдера буде працювати з наданими їм даними - і саме ці дані мені необхідно вважати і по-своєму поміняти. А при закритому датасета ніякі зміни проводитися не будуть (((((((
Тому, якщо хто може підказати КОМАНДИ для заповнення зміни полів датасета (або ручного заповнення гріда, без різниці), допоможіть. Більше нічого не потрібно :)))) (все-таки, не перший рік замужем, тільки з базами даних на такому рівні не доводилося працювати)


> Тому, якщо хто може підказати КОМАНДИ для заповнення
> Зміни полів датасета (або ручного заповнення гріда,
> Без різниці), допоможіть. Більше нічого не потрібно :)))) (все-таки,
> Не перший рік замужем, тільки з базами даних на такому рівні
> Не доводилося працювати)

Які команди? Insert, Append, Edit, Delete, Post?


> А будь-який проміжний датасета, неважливо, чи буде це TClientDataSet
> Або його предок, вимагає для свого відкриття заповнення або
> Властивості TableName, або вказівки імені провайдера (останнє
> І використовується в TADOQuery

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

Якого типу buf? Можливо, потрібно Form1.MemTableEh1.SetFieldData (. Buf ^.)

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

Тоді мені незрозуміла рядок buf: = AMySQLRow [i]
Якого типу AMySQLRow?
Спробуйте buf: = @AMySQLRow [i] (або @AMySQLRow [i] [1], якщо це масив рядків).

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

"Покажчик на рядок"?

AMySQLRow: array. of PString?
або все-таки array of string?
Якщо останнє, то потрібно @AMySQLRow [i] [1]

AMySQLRow. array of PChar

І що ми побачимо при ShowMessage (AMySQLRow [0])?

Не знаю, не пробував. Знаю, що шматок програми
var buf: string;
begin
# XA0; buf: = AMySQLRow [0] ^
end;

Запустіть ось це. Тоді зрозумієте, чому я питаю.

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

Не зовсім так.
# XA0; s: = "1234";
# XA0; p: = @s [1];
# XA0; showmessage (p); // видає 1234
# XA0; showmessage (p ^); // видає 1

щось ми не туди рулимо, ІМХО. Як описані параметри MemTableEh1.SetFieldData?

Щодо рядків - перевірте, що стоїть опція Project / Options / Compiler / Huge Strings і що немає директиви $ H-

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

Тоді начебто має працювати. Адже buf вказує на дані, судячи з Ваших відповідей. Може, дані невірно відображаються?

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

Знайшов я помилку, причому не у себе. У исходниках MemTableEh є процедура SetFieldData, а в ній захована процедура

# XA0; procedure BufferToVar (var Data: Variant);

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

замість
# XA0; begin
# XA0; # XA0; case Field.DataType of
# XA0; # XA0; # XA0; ftString, ftFixedChar, ftGuid:
# XA0; # XA0; # XA0; # XA0; Data: = String (PChar (Buffer ^));

Такі ось пироги.
Єдине, що поки не працює - AppendRecord, доводиться йти через городи

Я вже почав підозрювати, що глюк дійсно пов'язаний з компонентом. З нестандартними компонентами завжди є шанс нарватися на неприємність. Добре, що хоч вихідні є.

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

Схожі статті