Вопрос № 59971: Доброго здоровья! Посоветуйте, как бы сделать самому (или может, есть что готовое) для создания автоапгрейда программы. Что б, запустил exe, а он сам все установил, путь и что куда - сидит в реестре, найти можно. Но вот всё остальное не ясно, чем и к...Вопрос № 60030: помогите пожалуйста. есть таблица с полями:
Name(фио спортсмена)
Vid_sporta(вид спорта, которым он занимается)
Klub(клуб, в котором он играет)
Record(и его рекорд)
при нажатии на кнопку - в гриде отображаются все спортмены, занима...Вопрос № 60088: Вопрос о папках и файлах. Возьмем, например, такую программу, как WinRAR. Папка вожет быть преобразована ей в файл *.rar. При этом если просто задать compression method как store, то фактически новый файл и будет представлять собой последовательность...
Вопрос № 59.971
Доброго здоровья! Посоветуйте, как бы сделать самому (или может, есть что готовое) для создания автоапгрейда программы. Что б, запустил exe, а он сам все установил, путь и что куда - сидит в реестре, найти можно. Но вот всё остальное не ясно, чем и как паковать и что б был один setup.ехе не ясно, да и сценарии обновления тоже как грамотно реализовать не знаю. Можно конечно воспользоваться штатным InstallShield, но очень он тяжёл, 3.5 мБ добавляет - просто ужас. И как можно реализовать проверку доступности и
загрузку обновления на HTTP сервере? Спасибо огромное откликнувшимся :-)
Отправлен: 24.10.2006, 02:09
Вопрос задал: SuperMaxx (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: AlexanderR
Здравствуйте!
Вместо InstallShield советую использовать Inno Setup. Очень гибкая настройка и бесплатный.
--------- Если ты хочешь понять я тебе помогу, но я не буду выполнять за тебя твою работу.
Ответ отправил: AlexanderR (статус: 1-ый класс)
Ответ отправлен: 24.10.2006, 02:51 Оценка за ответ: 5 Комментарий оценки: Спасибо, Inno отличная программа.
Отвечает: Маренич Владимир
Здравствуйте, SuperMaxx!
http://www.innosetup.com/
там свежая версия (5.1.18)
у меня 4.1.1 делала ехешник 320кб + мои упакованные данные
А по поводу обновления можно использовать простой "тупой" способ:
положить по определенному адресу текстовый файлик (например, UPDATE.txt),
в нем писать версию выложенного обновления (например, 1.0.0.18).
Ехешник клиента читает этот файл, проверяет версию обновления со своей, при несовпадении качает уже UPDATE.exe и потом его запускает, а сам завершает свою работу (для того чтобы UPDATE.exe смог его заменить).
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 24.10.2006, 12:49 Оценка за ответ: 5 Комментарий оценки: Огромное спасибо, особенно за http://www.innosetup.com/ то что надо!
Отвечает: Sattar
Здравствуйте, 1!
var
F:TStream;
F1:TextFile;
S:string;
function ExtractFileNameFromURl(URL:string):string;
var
i:integer;
begin
for i:=Length(URL) downto 0 do
if URL[i]='/' then
begin
Result:=Copy(URL,i,Length(URL));
Exit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
F:=TFileStream.Create(GetCurrentDir+'
ew.txt',fmCreate);
IdHTTP1.Get('http://www.program.ua/upgrade/new.txt',F);
F.Free;
AssignFile(F1,'new.txt');
Reset(F1);
While Not(Eof(F1)) do
begin
Readln(F1,S);
F:=TFileStream.Create(GetCurrentDir+''+ExtractFileNameFromURl(S),fmCreate);
IdHTTP1.Get(S);
end;
end;
Ответ отправил: Sattar (статус: 2-ой класс)
Ответ отправлен: 24.10.2006, 22:20 Оценка за ответ: 5 Комментарий оценки: Спасибо большое за наглядный пример, очень помог!
Вопрос № 60.030
помогите пожалуйста. есть таблица с полями:
Name(фио спортсмена)
Vid_sporta(вид спорта, которым он занимается)
Klub(клуб, в котором он играет)
Record(и его рекорд)
при нажатии на кнопку - в гриде отображаются все спортмены, занимающиеся видом спорта, который выбран в комбобоксе; а текущей должна быть запись спортсмена с максимальным рекордом в этом виде спорта.
использовала Filter - все нормально с первой частью задачи, а вот как со второй(максимальный балл)?
Надеюсь, что смогла доступно объяснить...заранее спасибо
Отправлен: 24.10.2006, 13:44
Вопрос задала: Nastya (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 9)
Отвечает: Rusland
Здравствуйте, Nastya!
Filter здесь не поможет. Вместо компонета TTable используйте TQuery. Взамен Filter здесь указывается сам sql-запрос... например SELECT * FROM tbl WHERE Vid_sports='значение комбобокса' ORDER BY Record DESC;
--------- Если партия скажет есть контакт, будем есть контакт.
Ответ отправил: Rusland (статус: Специалист)
Ответ отправлен: 24.10.2006, 14:15
Отвечает: Маренич Владимир
Здравствуйте, Nastya!
К сожалению Вы не указали, какая СУБД используется и какие типы полей.
Также я бы на Вашем месте добавил какое-нибудь числовое поле с уникальным значением (типа код спортсмена) для более быстрой идентификации (поиску) нужной записи, т.к. поиск по фио занимает гораздо больше времени и теоретически могут быть спортсмены - однофамильцы с одинаковым именем и отчеством :)
В общем виде можно сделать так:
1. Вместо фильтра лучше использовать запрос:
Query1.SQL.Text:='SELECT * FROM Table WHERE Vid_sporta='''+ComboBox1.Text+''' ORDER BY Name';
Query1.Open;
2. Выполнить запрос:
Query2.SQL.Text:='SELECT MAX(Record) FROM Table WHERE Vid_sporta='''+ComboBox1.Text+'''';
Query2.Open;
Если не знаете что такое запросы и как их использовать, то ничего другого не остается как перебирать весь набор данных в поисках максимального значения и потом перейти на эту самую запись:
MaxName := '';
MaxRec := 0;
Table1.First;
while not Table1.Eof do
if Table1.FieldByName('Record').AsInteger>MaxRec then
begin
MaxRec := Table1.FieldByName('Record').AsInteger;
MaxName := Table1.FieldByName('Name').AsString;
end;
Table1.Next;
end;
Table1.Locate('Name', MaxName, []);
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 24.10.2006, 14:28
Отвечает: Gh0stik
Здравствуйте, 1!
Заранее извеняюсь за ответ с опозданием, но....
Привожу код который Вы так слезно просили...
procedure TForm1.Button3Click(Sender: TObject);
var mx:integer;
begin
tb_All.First;
mx:=Record.Value;
while not tb_All.Eof do
begin
if mx < Record.Value then mx:=Record.Value;
tb_All.Next;
end;
tb_All.Locate('Record',mx,[]);
end;
Обращаю Ваше внимание на то что tb_All - это название той таблицы(базы) которую Вам нужно обработать....
И маленький коментарий к предудущему ответу, так как нам не известно какое значение может принимать максимальный элемент (рекорд же может быть и отрицательным...), то соответственно считаем что максимальный - есть первый... (mx:=Record.Value;)
Удачи!!!
--------- Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Практикант)
Ответ отправлен: 24.10.2006, 14:46
Отвечает: sir henry
Здравствуйте, Nastya!
Я Вам предложу способ про который эксперты, большие поклонники SELECT ... FROM, видимо уже успели забыть. Тем более, что SELECT Вы еще не проходили. :)
Это старинный классический способ. Нужно создать индекс по полю Record по убыванию и назначить его текущим. Тогда, после применения фильтра для выбора вида спорта, первой записью у Вас будет автоматически запись с самым большим рекордом.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 24.10.2006, 15:44
Вопрос № 60.088
Вопрос о папках и файлах. Возьмем, например, такую программу, как WinRAR. Папка вожет быть преобразована ей в файл *.rar. При этом если просто задать compression method как store, то фактически новый файл и будет представлять собой последовательность файлов, содержащихся в этой папке, размещение этих файлов в структуре каталогов и др. инф., очевидно, также сохраняется в этом файле.
Файл представляет собой по теории ленту байт, заканчивающуюся символом eof. Но что он (eof) представляет из себя?
Короче, вопрос в том, как выполнить такое преобразование.
Все это делается для создания небольшого архиватора.
Отправлен: 24.10.2006, 23:58
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Andronik
Здравствуйте, 1!
Хм. Насколько я понял из вопроса, настолько и отвечу. EOF (End of File) - это обыкновенный непечатаемый символ ASCII (сужу по временам DOS, сейчас, может, и нет), служащий для операционной системы признаком окончания файла. Код его, если мне не изменяет память, 1A. В самом файле этот символ может присутствовать, а может и нет - в DOS этот символ печатался в таблицу FAT, но никак не в файл. Если этот символ присутствует в файле, то при чтении его в текстовом виде будут прочитаны только символы до EOF, а при чтении
в бинарном виде файл будет зачитан по информации из ОС, независимо от находящихся в файле символов.
А что касается архиватора, то здесь все несколько проще. В начале (или конце, кому как удобнее) пишется таблица размещения файлов внутри архива, а используются ее данные, словно вы работаете с файловой системой. На словах это объяснить не очень просто, поэтому лучше взглянуть на реализацию одного из бесплатных архиваторов, например, 7zip (http://www.7-zip.org/download.html)
--------- Запрограммировать можно все... кроме собственного поведения
Ответ отправил: Andronik (статус: 1-ый класс)
Ответ отправлен: 25.10.2006, 01:00
Отвечает: sir henry
Здравствуйте, Blackie!
Если говорить в двух словах, то архив состоит из двух частей (условно):
1. Иерархический список файлов, типа как FAT. Это названия файлов и связанные с ними указатели, где тот или иной файл хранится в сжатом виде в области сжатых данных. Этот список не сжат и его можно разглядывать, как например в FARe или в ТС, зайдя в этот файл.
2. Область сжатых данных. Здесь, собственно, лежат файлы в сжатом виде, один за другим.
Эти две части формируются отдельно друг от друга и записываются последовательно друг за другом.
Можно сделать и маленько по другому, как в RARe. Там каждому блоку сжатого файла, предшествует его полное название (вместе с каталогом).
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 25.10.2006, 07:35 Оценка за ответ: 5