Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 01.09.2015, 08:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Kaktuz
...Связанно это с тем что когда код записан в событие Form1.Action, а не напрямую в объекте.
Код:
Form1.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+WorkingFolder+'db1.mdb;Persist Security Info=False';
Если коннектстрочку задаёте кодом, тогда для упрощения удалите ADOConnection1 совсем, а в FormCreate запишите
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.ADOQuery1.SQL.Add('SELECT * FROM data');
  ADOQuery1Text1.OnGetText := ADOQuery1MemoFieldGetText;
  ADOQuery1Text2.OnGetText := ADOQuery1MemoFieldGetText;
  WorkingFolder := ExtractFilePath(ParamStr(0));
   Form1.ADOQuery1.ConnectionString := 
  'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
  WorkingFolder +
  'db1.mdb;Mode=ReadWrite;Persist Security Info=False';
  Form1.ADOQuery1.Active := True;
  ScanningFolder(WorkingFolder, nil);
end;
Ответить с цитированием
  #17  
Старый 01.09.2015, 14:32
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Удалил компоненты и заново расставил - заработало без ошибок.

Вообще мы немного отклонились от темы. В первую очередь интересовала связь файлов и таблицы.
Сканируем каталог, получаем полный путь к файлу. Отправляем запрос в таблицу: 'SELECT file FROM files WHILE file=file.txt'. Если такой записи нет - добавляем.
Как просто получить доступ к запрашиваемым данным? Это также потребуется когда необходимо будет загрузить данные из второй таблицы.
Ответить с цитированием
  #18  
Старый 01.09.2015, 19:00
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

У тебя процесс просто "умрет", если ты будешь на каждый файл делать свой запрос проверки и файлов будет хоть сколько-нибудь много. Тебе же сказали - всавляй все во временную (буфферную) таблицу, а в самом конце из нее переноси в основную то, чего в ней, основной, нету.

Что значит "получить доступ"?
Ответить с цитированием
  #19  
Старый 01.09.2015, 23:04
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Я извиняюсь за сравнение, но вот на PHP делаем запрос и получаем двухмерный массив с запрашиваемыми данными. И уже дальше можно без труда (Table[0][0]) получить данные с любой ячейки полученных данных.
За временную таблицу я понял, но её же нужно правильно создать. Не выводить же в DBGrid. Таблица должна быть как-то в памяти и к ней должен быть легкий доступ. Что бы можно было получить имя файла и id.
Ответить с цитированием
  #20  
Старый 02.09.2015, 00:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В Дельфи - делаем запрос и получаем RecordSet (который DataSet и его наследники). Навигация по строкам выполняется с помощью методов First, Next, Last и т.д. Доступ к полям текущей записи осуществляется либо по индексу через свойство Fields, либо по имени через метод FieldByName.
Например:
Код:
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select ID, Name from MyTable');
ADOQuery.Open;
ADOQuery.First;
While Not ADOQuery.EoF Do
  Begin
    S := ADOQuery.Fields[0].AsString;
    S := S + ', ' + ADOQuery.FieldByName('Name').AsString;
    ShowMessage(S);
    ADOQuery.Next;
  End;
ADOQuery.Close;

А таблицу надо создавать в БД.
Фактически, у тебя в БД для файлов должно быть 2 таблицы. Одна "боевая" и вторая - для вставки. Здесь термин "временная" использовался в том смысле, что данные буду прокачиваться через нее, а с точки зрения БД она вполне себе постоянная. Сам алгоритм выглядит примерно так:
0. В БД есть 2 таблицы одинаковой структуры: MyFiles и MyFilesTemp
1. Чистим таблицу MyFilesTemp [DELETE FROM MyFilesTemp].
2. Вставляем в таблицу MyFilesTemp все найденные файлы [INSERT INTO MyFilesTEMP (ID, Name) VALUES (:ID, :Name)]
Если ID автоинкрементное, то его вставлять не надо.
3. "Переливаем" в основную таблицу MyFiles только те файлы, которых в ней нет [INSERT INTO MyFiles f SELECT t.ID, t.Name FROM MyFilesTemp t WHERE NOT EXIST (SELECT v.Name FROM MyFiles v WHERE v.Name = t.Name)]
Синтаксис надо проверить для конкретной реализации БД. Может в ней есть MINUS или EXCEPT, что упростит запрос.

Последний раз редактировалось lmikle, 02.09.2015 в 00:27.
Ответить с цитированием
  #21  
Старый 02.09.2015, 16:50
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А каков конечный результат - как понимаю в TreeView строится дерево из списка файлов, если какой-то из них "занят" или отсутствует либо что-то ещё, то показать его состояние определённой иконкой, при клике должна отображаться инфа об этом файле, её содержимым можно управлять, так что-ли?

Есть подозрение, что можно и без БД в данной задаче обойтись, напр. средствами пары-тройки TStings, раз поиск по ID идёт - кстати, есть такой англицкий словарик Мюллера основанный на просмотре txt-файла, более 60 тыс. слов в нём, а поиск почти мгновенный. Прояснили бы задачу поконкретнее, может есть другой способ её реализации
Ответить с цитированием
  #22  
Старый 02.09.2015, 18:20
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Imikle, вот это "ADOQuery.Fields[0].AsString;" уже что-то похожее на то что нужно. Раньше пробовал так - не получалось, сейчас вроде нормально работает. Буду пробовать.

Alegun, поясню. Один знакомый состоит в клубе (Вроде Notabenoid) где занимаются переводом игр. Одна из игр в переводе которой он участвует находится в Beta версии и после каждого обновления файлы с текстов (Lua код) подвергается изменениям. Таким образом приходится каждый раз, каждый файл сверять с новым на наличие отличий и подставлять перевод. Согласитесь это мучительно, объемы там не маленькие.
Вот решил помочь. Написать программу которая будет делать следующее:
1. TreeView для удобного переключения между файлами и просмотра по иконке, обработан (переведен) ли этот файл.
2. Перевод осуществляется таким образом. Открыв файл копируем из него строку (en) и вставляем в первую ячейку, во второй ячейки записываем перевод.
3. После окончания используем StringReplace будем осуществлять перевод. Перевод всех файлов сразу.
Таким образом при выходе новой версии достаточно будет поместить в рабочую папку новые файлы, запустить перевод и все файлы будут переведены.
Это всё реально и есть рабочий проект. Как я уже писал, изначально я использовал TIniFile для этого дела, но на отметке 404 записей прекращает считывать информацию. 404 файла это маловато. У меня Delphi 7, у кого версия поновее говорят у них больше читает. Рассказав об больших объемах файлов посоветовали использовать БД. Вот и мучаюсь теперь с ней.
Еще вроде как-то можно увеличить размер буфер при котором считываются данные (IniFile.ReadString), и можно будет прочитать больше 404 файлов.

Загадка: Изображение с каким ID будет видно в BitBtn после нажатия?
Код:
Form1.Edit1.Enabled := True;
Form1.ImageList1.GetBitmap(5, Form1.BitBtn1.Glyph);
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if Form1.Edit1.Enabled then
  begin
    Form1.Edit1.Enabled := False;
    Form1.ImageList1.GetBitmap(4, Form1.BitBtn1.Glyph);
  end
  else
  begin
    Form1.Edit1.Enabled := True;
    Form1.ImageList1.GetBitmap(5, Form1.BitBtn1.Glyph);
  end;
end;

Последний раз редактировалось Kaktuz, 02.09.2015 в 18:24.
Ответить с цитированием
  #23  
Старый 02.09.2015, 19:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Как обычно, ничего не понял т.е. нужно менять содержимое какого-то файла в зависимости от флажка его обработки из соответствующих этому файлу записей в хранилище... Название и путя "подопытного" файла как раз в нодах тревью и лежит выходит


Оффтоп:

Разгадка: ID: 4, но лучше вот так попробуйте
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Form1.Edit1.Enabled:= not Form1.Edit1.Enabled;
 if Form1.Edit1.Enabled then
  Form1.ImageList1.GetBitmap(4, Form1.BitBtn1.Glyph);
 else
  Form1.ImageList1.GetBitmap(5, Form1.BitBtn1.Glyph);
end;
Ответить с цитированием
  #24  
Старый 02.09.2015, 21:31
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

В первой таблице (где список файлов) "Флажок" (condition) служит исключительно для того чтобы пользователь видел в TreeView какие файлы уже переведены, а какие нет. ID служит "ссылкой" на вторую таблицу для вывода данных (это показано на изображении в посте #5) "SELECT * FROM data WHERE id = 1;". 1 - это номер id с первой таблицы.

Не правильно, ID 5 будет. Ответ на задачу:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  Form1.Edit1.Enabled := not Form1.Edit1.Enabled;
  if Form1.Edit1.Enabled then
    Form1.ImageList1.GetBitmap(4, bmp)
  else
    Form1.ImageList1.GetBitmap(5, bmp);
  Form1.BitBtn1.Glyph.Assign(bmp);
end;
Такая же проблема и с Image, но там есть Refresh, а в BitBtn нету... ну или не работает.

Последний раз редактировалось Kaktuz, 02.09.2015 в 21:45.
Ответить с цитированием
  #25  
Старый 03.09.2015, 11:41
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Совсем оффтоп:

Цитата:
Сообщение от Kaktuz
...Такая же проблема и с Image, но там есть Refresh, а в BitBtn нету... ну или не работает.
Да нет здесь проблемы - рисунка на кнопке является "внедрённым" объектом, изменяется какбы отдельно и при смене иконки требует нового распределения памяти для себя и отдачи старого куска обратно в кучу, фарш невозможно прокрутить назад Всё логично, в делфи как раз этим и заведует метод эссайн... drkb
Ответить с цитированием
  #26  
Старый 03.09.2015, 22:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Kaktuz
Не правильно, ID 5 будет. Ответ на задачу:
...
Такая же проблема и с Image, но там есть Refresh, а в BitBtn нету... ну или не работает.

С фига ли? В приведенном коде ID будет 4.
Если где-то еще у тебя что-то вызывается или обоработчик вызывается, например, дважды, то это твои проблемы. При нормальном течении вещей ID будет 4.

Refresh для BitBtn не нужен. Кстати, скорее всего есть Invalidate или Repaint. Но вообще должно само перерисовываться при смене картинки (если ты ее меняешь "по правилам", если залезть грязными руками внутрь компонента фактически в обход VCL, а это можно сделать, то сам озабодься об извещении его о том, что надо перерисоваться).
Ответить с цитированием
  #27  
Старый 04.09.2015, 01:07
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А не проще воспользоваться тем же Тотал Коммандером?
Сравнить 2 каталога на различия в файлах и их контексте, для ТС - детская задача.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #28  
Старый 04.09.2015, 08:55
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
А не проще воспользоваться тем же Тотал Коммандером?
Сравнить 2 каталога на различия в файлах и их контексте, для ТС - детская задача.
Я сильно не вникал в ТС, но видел данную возможность (Файл > Сравнить по содержимому). Вот только я не наблюдал там тонкой настройки. "ТС замени текст в файле 1 на текст из файла 2, кроме параметров. Проделай это со всеми (2000-3000 шт.) файлами".
Если это можно сделать через ТС, поделитесь методом, буду очень признателен.
Ответить с цитированием
  #29  
Старый 04.09.2015, 10:33
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Kaktuz
..."ТС замени текст в файле 1 на текст из файла 2, кроме параметров. Проделай это со всеми (2000-3000 шт.) файлами"...
На самом деле, идея-то сборки очень хорошая, здесь лучше использовать специальную утилиту, чем универсала. С поиском проблем нет, даже стандартными средствами, а вот с контентом - ТС, может выложите пару ориг/перевод-файл для проверки, и как всёже организован флаг его "кондиции"?
Ответить с цитированием
  #30  
Старый 04.09.2015, 14:00
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
На самом деле, идея-то сборки очень хорошая, здесь лучше использовать специальную утилиту, чем универсала. С поиском проблем нет, даже стандартными средствами, а вот с контентом - ТС, может выложите пару ориг/перевод-файл для проверки, и как всё же организован флаг его "кондиции"?
Вот пару файлов с которыми я экспериментирую: Translated.7z
Вот изображение Project1.png с предыдущего проекта как это выглядит. Или интересует сам код, метод работы?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter