|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Цитата:
Код:
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
|
|||
|
|||
Удалил компоненты и заново расставил - заработало без ошибок.
Вообще мы немного отклонились от темы. В первую очередь интересовала связь файлов и таблицы. Сканируем каталог, получаем полный путь к файлу. Отправляем запрос в таблицу: 'SELECT file FROM files WHILE file=file.txt'. Если такой записи нет - добавляем. Как просто получить доступ к запрашиваемым данным? Это также потребуется когда необходимо будет загрузить данные из второй таблицы. |
#18
|
|||
|
|||
У тебя процесс просто "умрет", если ты будешь на каждый файл делать свой запрос проверки и файлов будет хоть сколько-нибудь много. Тебе же сказали - всавляй все во временную (буфферную) таблицу, а в самом конце из нее переноси в основную то, чего в ней, основной, нету.
Что значит "получить доступ"? |
#19
|
|||
|
|||
Я извиняюсь за сравнение, но вот на PHP делаем запрос и получаем двухмерный массив с запрашиваемыми данными. И уже дальше можно без труда (Table[0][0]) получить данные с любой ячейки полученных данных.
За временную таблицу я понял, но её же нужно правильно создать. Не выводить же в DBGrid. Таблица должна быть как-то в памяти и к ней должен быть легкий доступ. Что бы можно было получить имя файла и id. |
#20
|
|||
|
|||
В Дельфи - делаем запрос и получаем 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
|
||||
|
||||
А каков конечный результат - как понимаю в TreeView строится дерево из списка файлов, если какой-то из них "занят" или отсутствует либо что-то ещё, то показать его состояние определённой иконкой, при клике должна отображаться инфа об этом файле, её содержимым можно управлять, так что-ли?
Есть подозрение, что можно и без БД в данной задаче обойтись, напр. средствами пары-тройки TStings, раз поиск по ID идёт - кстати, есть такой англицкий словарик Мюллера основанный на просмотре txt-файла, более 60 тыс. слов в нём, а поиск почти мгновенный. Прояснили бы задачу поконкретнее, может есть другой способ её реализации Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#22
|
|||
|
|||
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
|
||||
|
||||
Как обычно, ничего не понял т.е. нужно менять содержимое какого-то файла в зависимости от флажка его обработки из соответствующих этому файлу записей в хранилище... Название и путя "подопытного" файла как раз в нодах тревью и лежит выходит
Оффтоп: Разгадка: 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
|
|||
|
|||
В первой таблице (где список файлов) "Флажок" (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; Последний раз редактировалось Kaktuz, 02.09.2015 в 21:45. |
#25
|
||||
|
||||
Совсем оффтоп:
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#26
|
|||
|
|||
Цитата:
С фига ли? В приведенном коде ID будет 4. Если где-то еще у тебя что-то вызывается или обоработчик вызывается, например, дважды, то это твои проблемы. При нормальном течении вещей ID будет 4. Refresh для BitBtn не нужен. Кстати, скорее всего есть Invalidate или Repaint. Но вообще должно само перерисовываться при смене картинки (если ты ее меняешь "по правилам", если залезть грязными руками внутрь компонента фактически в обход VCL, а это можно сделать, то сам озабодься об извещении его о том, что надо перерисоваться). |
#27
|
||||
|
||||
А не проще воспользоваться тем же Тотал Коммандером?
Сравнить 2 каталога на различия в файлах и их контексте, для ТС - детская задача. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#28
|
|||
|
|||
Цитата:
Если это можно сделать через ТС, поделитесь методом, буду очень признателен. |
#29
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#30
|
|||
|
|||
Цитата:
Вот изображение Project1.png с предыдущего проекта как это выглядит. Или интересует сам код, метод работы? |