Показать полную графическую версию : Delphi .: [все вопросы] :.
Serega_, спасибо тебе большое!!!!!!!!!!!!!!!!!!
Проблемка такова: нужно создать DBGrid (или лучше сказать, что ClientDataSet), в котором последние 2 записи нельзя будет редактировать. А все остальные предыдущие можно. То бишь программа никак не должна реагировать при щелчке по ячейкам, соотвествующим одной из 2-х последних записей. Как это реализовать?
Delirium
23-03-2009, 01:24
ALI, вам нужно всего лишь в коде считывать количество строк в DBGrid после загрузки и обрабатывать нажатия по гриду. В обработке проверять, если индекс строки >=количество_строк -2, то не выполнять код, иначе - обрабатывать.
Как можно вертикально скроллировать DBGrid, не перемещаясь по записям БД?
Delirium
24-03-2009, 01:12
что вы имеете в виду под скроллировать? заполнять грид записями и чтобы курсор автоматом был на последней строке? как при установках программ? ТОгда надо запускать наполнение грида в параллельном потоке и применять функцию ScrollToCaret (http://thetwat.blogspot.com/2007/06/delphi-vclnet-scroll-textbox-whilst.html).
Под словом "скроллировать" я понимаю возможность перемещения в конец (начало, середину и т.д.) грида с оставлением курсора на той записи, на которой он был до скроллирования. Аналоги: Word, Excel.
Delirium
25-03-2009, 00:50
Ну все равно можно обмануть тем же ScrollToCaret. Вначале запоминаем позицию курсора, затем перемещаемся вниз и курсор выставляем в первоначальное положение.
Дык, как только я выставлю курсор в первоначальное положение, так сразу же изменится общий вид DBGrid'а, так как DBGrid - это представление DataSet'а, а не произвольная таблица, в которой отображаются некая информация. Смещение в ДБГриде отражает смещение в ДэйтаСете. И именно поэтому я задал тот вопрос, который задал. :)
Всем привет , нужна помощь.
Как организовать в ходе программы , чтобы при выполнении некоторого условия выскакивало окно с предложением нажать кнопку для продолжения выполнения программы. Отображение окна я написал , а вот как заставить программу "встать" а потом при нажатии кнопки чтобы она продолжила выполнение с того места где остановилась не знаю.
VasyaPupkin81
20-04-2009, 08:18
А можно взглянуть как ты окно отображаешь?
З.Ы. Насколько я понял у тебя выполняется какой-то цикл или что-то в таймере. Если так, то посмотри Application.MessageBox.
Delirium
20-04-2009, 08:19
Выполнение задачи необходимо запускать в отдельном потоке, при выскакивания окна делать заморозку потока (thread.suspend или thread.sleep, точно не помню). Для продолжения размораживаем поток Thread.Resume. Как то так.
Ещё вариант - сделать "разделяемую" задачу, то есть загнать все внутренние цикловые переменные долго выполняемой программы в класс TMyJob, ввести переменную состояния TMyJob.state: integer {0=constructing, 1=running, 2=suspened, 3=finished}, и функцию TMyJob.proceed(), которая возвращается если 2<=state и содержит выполняемый цикл. Чтобы всё гладко работало, нужно периодически в цикле делать так:
function TMyJob.proceed() : boolean;
begin
while 2<=state do begin
ProcessMessages; //обрабатывает сообщения, в т.ч. от мышки и таймера
for ... // цикл, который работает примерно 0.5 - 1 секунду
end
end
Чтобы продложить работу такой приостановленной задачи, достаточно вызвать TMyJob.proceed(). Если есть несколько таких "задач", то лучше имитировать многозадачность:
var jobs : array of TMyJob;
var job_n: integer;
procedure sheduled_jobs(); // запускать из Application.OnIdle
begin
if (High(job_n) < job_n) job_n = Low(job_n);
jobs[job_n].proceed();
end;
function TMyJob.proceed() : boolean;
begin
if 2<=state then begin
for ... // цикл, который работает примерно 0.5 - 1 секунду
end
end
Добрый день, дамы и господа! Помогите, пожалуйста, передать двумерный динамический массив в отчет FastReport4 с целью дальнейшего его использования в скрипте. С обычной переменной все просто, как я понимаю, это надо делать следующим образом:
Report.Script.Variables['a'] := a;
Где a - некая переменная, например, типа integer. Но как быть с массивом?
Здравствуйте, помогите разобраться, почему при использовании полного пути функция FileExists работает нормально, а при использовании относительного - нет... вот пример кода:
// зависимость: ShlObj
function TForm1.GetSpecialPath(CSIDL: Word): string;
var
s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then
s := '';
Result := PChar(s);
end;
procedure TForm1.btn1Click(Sender: TObject);
var
APPDATA: string;
begin
APPDATA:= GetSpecialPath(CSIDL_APPDATA);
// здесь выводит в сообщении полный путь до файла, т.е. всё нормально
ShowMessage(APPDATA + '\Microsoft\User Account Pictures\Default Pictures\Windows.bmp');
// в таком варианте не работает...
if FileExists(APPDATA + '\Microsoft\User Account Pictures\Default Pictures\Windows.bmp') = True then
ShowMessage('Урааа!!!') else ShowMessage('Zhopa kakaja-to...');
// при указании полного пути, всё нормально...
if FileExists('C:\Documents and Settings\All Users\Application Data\Microsoft\User Account Pictures\Default Pictures\Windows.bmp') = True then
ShowMessage('Урааа!!!') else ShowMessage('Zhopa kakaja-to...');
end;
цитата из WinAPI:
CSIDL_APPDATA (0x001a)
Version 4.71. The file system directory that serves as a common repository for application-specific data. A typical path is C:\Documents and Settings\username\Application Data. This CSIDL is supported by the redistributable Shfolder.dll for systems that do not have the Microsoft® Internet Explorer 4.0 integrated Shell installed.
Т.е. если будешь по внимательнее то заметишь что ты пытаешься найти этот файл в C:\Documents and Settings\username\Application Data а не C:\Documents and Settings\All users\Application Data
Вот еще цитата:
CSIDL_COMMON_APPDATA (0x0023)
Version 5.0. The file system directory containing application data for all users. A typical path is C:\Documents and Settings\All Users\Application Data.
т.е. тебе надо поставить вместо CSIDL_APPDATA это CSIDL_COMMON_APPDATA (если делфи ругается что нет такого то ставь число - $23)
FlatX007
02-05-2009, 20:04
Помогите решить простенькую задачу.
Нужно сохранить HTML код страницы НТТРS во временную папку ввиде ТХТ-документа.
Делать это нужно циклически каждые 20 секунд.
И ещё будут нужны дополнительные библиотеки ?
FlatX007, поиск (http://www.google.ru/search?hl=ru&q=%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C+HTML+%D0%BA%D0%BE%D0%B4+%D1%81%D1%82%D1%80% D0%B0%D0%BD%D0%B8%D1%86%D1%8B+%D0%B2+%D0%94%D0%B5%D0%BB%D1%84%D0%B8&lr=&aq=f&oq=)
Добавил в шапку темы интересную статью. Особенно будет интересна для пользователей Delphi версий 4-7 (включительно).
Такой вопрос - пишется бот для брутфорса.
Функционал - при появлении в файле good данных (вес файла становится больше 0 байт), отправляет их куда указано, потом прога закрывается.
Хотелось бы сделать, чтоб прога не закрывалась, а висела дальше, и если появится вторая/третяя/сто третяя то тоже отсылал.
Как такое исполнить?
То есть проверку по строкам, и не по весу файла.
Спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.