Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
1

Как через TMemo записывать данные в поля таблиц

25.03.2011, 21:25. Показов 4703. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пожалуйста помогите с новой формой "добавление новой книги". С компонентом Memo не разберусь как через него записыват данные в поля таблиц. Сами таблицы (на всякий случай) приведены ниже. Структура новой формы и что от неё требуется тоже приведено ниже.

Пожалуйста помогите очень надо. Сам пытался разобраться не получается, помогите.


Используемые таблицы:

Books (Form1.Table1 - для первой формы)
BkId - идентификатор книги, тип Autoincrement, ключ таблицы
Name - название книги, тип Alpha
Number - количество экземпляров, тип Short
Note - аннотация, тип Memo
Вторичней индекс BkInd по полю Name

Writers (Form1.Table3)
WrId - идентификатор, тип Autoincrement, ключ таблицы
Name - имя писателя, тип Alpha
Biography - биография писателя, тип Memo
Вторичней индекс WrInd по полю Name

Authors (Form1.Table2)
BkId - идентификатор книги, тип Long Integer, ключевой атрибут
WrId - идентификатор писателя, тип Long Integer, ключевой атрибут

Имеются компоненты: Edit1, Edit2, Memo1,Memo2, Table1, Table2, DataSourse1, DataSourse2, Button1.

Название книги вводится в компонент Edit1, имена авторов в компонент Memo1(нужно вводить несколько авторов книги). Каждый автор начинается с новой строки (для перехода использовать Enter). Аннотацию надо занести в Memo2.

По нажатию на кнопку Button1 обрабатывать следующее:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm2.Button2Click(Sender: TObject);
begin
  if Form1.Table1.Locate('Name',Edit1.Text,[]) = true then exit;    // проверяю наличие книги если есть выходим 
  Form1.Table1.Append;
                                                                                        // формирую поля записи
  Form1.Table1.FieldByName('Name').AsString:=Edit1.Text;          // Название книги
  Form1.Table1.FieldByName('Number').AsString:=Edit2.Text;       // Количество книг
  Form1.Table1.FieldByName('Note').AsString:= ??????;               // Как заполнить поле Note Вводя строку в Memo2?
  Form1.Table1.Post;
  for i:=0 to Memo1.Lines.Count-1 do
   begin
    if Form1.Table3.Locate('Name', ------ ) = false then    // проверить наличие автора в таблице Writers если автора нет, 
                                              //то добавит новую запись (опять же не знаю как в Memo проверять и записывать)
      Form1.Table3.Append;
      ...................
      ??????
      ...................
      Form1.Table3.Post;
 
    
end;

Пожалуйста помогите.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2011, 21:25
Ответы с готовыми решениями:

Как можно сохранить данные в файле из TMemo в кодировке ASCII?
Как можно сохранить данные в файле из TMemo в кодировке ASCII, для просмотра с помощью Досовских...

Как поместить данные из столбцов нескольких таблиц одного файла mdb в поля одной формы?
Как поместить данные из столбцов нескольких таблиц одного файла mdb в поля одной формы? Например,...

TMemo, как сделать не редактируемой часть поля.
Программа читает содержимое памяти и выводит в полн Мемо в HEX виде. Хочу добавить возможность...

Форма: как сделать используя данные таблицы из поля со списком, данные второго поля заносятся автоматически
Добрый день уважаемые форумчане! Разрабатывается база по учету трудозатрат. 1.В таблицу ...

10
69 / 69 / 43
Регистрация: 26.01.2011
Сообщений: 160
25.03.2011, 21:51 2
А что с Memo1.Text не работает?
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
26.03.2011, 11:05  [ТС] 3
А что с Memo1.Text не работает?

Form1.Table1.FieldByName('Note').AsString:= Memo1.Text; // так не записывает, записывает "(Memo)" . Может потому что поле 'Note' в таблице имеет тип Memo?
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
26.03.2011, 11:59 4
Krot_F,
Может потому что поле 'Note' в таблице имеет тип Memo?
Нет, это здесь совершенно не при чем.
Я попробую дать ВАм один совет, не будучи на 100% уверенным в его точности. Судя по всему Вы используете Парадокс и, насколько помнится, тип Memo в парадоксе аналог типу Blob. Если это так, то попробуйте загрузить значение в поле, используя объект TStream (точнее его наследников TMemoryStream или TFileStream). Делается это приблихительно так. Там, где это необходимо описывается переменная
Delphi
1
var S: TStream;
Далее, когда необходимо загрузить текст из Memo в поле таблицы делаем
Delphi
1
2
3
4
5
6
7
8
S := TMemoryStream.Create; //создали поток в памяти
Memo1.Lines.SaveToStream(S); //сохранили содержимое Memo1 в потоке S
S.Seek(0,0);//делаю всегда на всякий пожарный, где-то без этого обжегся, деталей не помню
try
  Form1.Table1.FieldByName('Note').LoadFromStream(S);// загрузили
finally
  S.Free;//освободили поток
end;
Попробуйте так. Во всяком случае с блоб полями я работаю по такой схеме.
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
26.03.2011, 12:46  [ТС] 5
Form1.Table1.FieldByName('Note').LoadFromStream(S); // пишет неопознаный идентификатор
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
26.03.2011, 13:07 6
Krot_F,
пишет неопознаный идентификатор
Сделайте с помощью редактора полей поля набора явными. (Двойной щелчок по датасету и затем с помощью контекстного меню "вытаскиваете" все поля в приложение в явном виде). У Вас появится объект с названием
Tabel1Note
Это и будет в явном виде указатель на поле Note и тип у него скорее всего будет TMemo. После этого попробуйте
Delphi
1
Form1.Tabel1Note.LoadFromStream(S);
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
27.03.2011, 14:43  [ТС] 7
SAMZ

Извените меня за столь тупые вопросы, но можете пожалуйста написать поподробней(понимаю конечно куда ещё подробней, но всё же) как сделать поля набора явными (в плоть до того куда нажимать). Если речь идет про DataSet: Active - True, то оно уже было установлено.

Извените про откровенную тупость. Не хотел пазориться, но деваться некуда. Вчера всё излазил не нашёл.

Заранее большое спасибо.
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
27.03.2011, 15:23 8
Цитата Сообщение от Krot_F Посмотреть сообщение
Извените про откровенную тупость. Не хотел пазориться
Самоуничижение - великий грех, позора тут никакого нет!
Цитата Сообщение от Krot_F Посмотреть сообщение
как сделать поля набора явными
Вы таботаете с наборами данных: это объекты типа TTable или типа TQuery. У каждого набора данных реализованы естественные для такого рода объектов возможности работы с полями набора данных. Одна из таких возможностей - неявные ссылки на поля набора данных. Когда в программе встречается выражение типа
Delphi
1
Form1.Table1.FieldByName('Note').AsString
или
Delphi
1
Form1.Table1.FieldByName('Note').LoadFromStream(S);
Вы оращаетесь к полю набора Table1 с именем Note неявно. Явного указателя на это поле в программе нет. При неявном обращении к полям результатом обращения является указатель на абстрактное поле TField, у которого может и не быть метода LoadFromStream.
Выхода из этого ровно два (по крайней мере мне известны два)
1. Получить указатели на поля в явном виде. Делается не просто, а очень ПРОСТО! Дважды кликаете мышкой на объект набора данных на форме (у Вас это Tabel1). Появится редактор полей (не может не появиться). Далее в окошке редактора полей (оно по-видимому у Вас будет пустым) правой клавишей мыши вызываете контекстное меню и выбираете Add all fielfs (или Ctrl + F) и все поля набора станут явными. У Вас появится переменная
Tabel1Note
2. Можно и немного иначе.
Delphi
1
2
3
if Form1.Table1.FieldByName('Note') is TMemoField then
  with Form1.Table1.FieldByName('Note')  as TMemoField do
  LoadFromStream(S);
но я на практике предпочитаю работать по первому варианту, хотя это дело вкуса.
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
27.03.2011, 17:07  [ТС] 9
Спасибо большое всё понятно, но только при выборе из контекстного меню Add all fielfs выходит диалоговое окно с ошибкой:

Access violation at address 05DB8B38. Read of address 9112DA8B.

Закрыв её и всё откомпилировав всё равно не пишет.

Из-за этой ошибки и не идёт запись наверно
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,255
27.03.2011, 17:58 10
Цитата Сообщение от Krot_F Посмотреть сообщение
но только при выборе из контекстного меню Add all fielfs выходит диалоговое окно с ошибкой:
Странно! С таким не встречался ни разу. А объект какай, TTable. Все свойства задаются статически: путь к БД, имя таблицы? Эти свойства определены?
Попробуй на всякий случай второй способ! Но это танцы с бубном!
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
28.03.2011, 15:45  [ТС] 11
SAMZ

Оказывается всё гораздо проще. Я по своей тупости при записи новой книги после добавления смотрел результат в компоненте DBGrid. Все поля вводились, а в поле Note постоянно вводилось "(MEMO)".
Только сейчас дошло чтобы проверить вывод через отдельную мемо командой:

Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button5Click(Sender: TObject);
begin
  memo1.Lines.Clear;
  While not(Table1.Eof) do
  begin
   memo1.Lines.Add(Table1.FieldByName('Note').AsString);
   Table1.Next;
  end;
end;
И показало что введённые данные все на месте.

Но выводит результат не отдельной выделенной книги, а всего столбца "Note" Это потому-что всё созраняется в файл таблицы и выводит всё содержимое?

Вводил через:

Pascal
1
Form1.Table1.FieldByName('Note').AsString:=Memo1.Text;


Извеняюсь, сам загнался и вас напряг.
0
28.03.2011, 15:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2011, 15:45
Помогаю со студенческими работами здесь

Как считать данные из TMemo?
Привет Всем!!! Возникла такая проблема. Есть компонент Memo и там данные: 0 100 1 10 50 0...

Как записывать данные
Здравствуйте. Нужно сделать справочник по кафедре( название кафедры, Фио препода, кол-во...

Как записывать числа через пробел, через scanner
Здравствуйте, подскажите пожалуйста как записывать числа через пробел, через scanner.

Привязка поля к листбоксу, которые черпает данные из двух таблиц
Здравствуйте. Форма, на ней листбокс, отображающий данные из двух таблиц: таблица "Спортсмены",...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru