Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi 2

Автор: SZap
Дата сообщения: 24.04.2006 14:10
XPEHOMETP
Спасибо, посмотрю...

Добавлено:
hhhhhhhhhhhhhhhhhh

Цитата:
Список хоть и раскрывается, но выбрать невозможно!

А DataField указан? А то еме некуда будет выбранное значение записывать...
Автор: hhhhhhhhhhhhhhhhhh
Дата сообщения: 24.04.2006 14:26
Да, DataField указан. Список ОТОБРАЖАЕТСЯ! ВЫБРАТЬ невозможно!!!!!
Автор: YuRRiX
Дата сообщения: 24.04.2006 14:34
Ситуация, есть служба, которая мониторит определенные события, и в зависимости от них осуществляет запуск программ. Вопрос: как заставить запущенное службой приложение быть видимым?
Автор: Sleepwalker
Дата сообщения: 24.04.2006 14:53
31416

Цитата:
как востановить память которая принадлежала z?


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

XPEHOMETP

Цитата:
Или еще такая штука - Excel Component Suite:

ага, платная
это при том, что в составе самой Дельфи есть целая пачка COM-серверов, в т.ч. и для ёхеля.

SZap
юзай OLE, оно хорошо излазено уже и практически любые начальные задачи на нем делаются без проблем.
загляни сюда еще, особенно в пункт "работа с Excel",
а также статьи оттуда же: 1, 2, 3




Добавлено:
YuRRiX

Цитата:
как заставить запущенное службой приложение быть видимым?


если ты стартуешь просто внешнее приложение, то функцией
FINDWindow находишь окно по заголовку или классу, получаешь его хэндл, затем функцией SetWindowPos устанавливаешь ему HWND_TOP.
за всеми описаниями отсылаю к хэлпу.
Автор: DroN_S
Дата сообщения: 24.04.2006 15:28
SZap
да например вот это вот
http://rapidshare.de/files/12979142/Vasilij_Kornjakov_Programmirovanie_dokumentov_i_prilozhenij_MS_Office_v_Delphi.rar.html
очень классная книга... советую
Автор: gpi
Дата сообщения: 24.04.2006 16:00
hhhhhhhhhhhhhhhhhh

Цитата:
Да, DataField указан. Список ОТОБРАЖАЕТСЯ! ВЫБРАТЬ невозможно!!!!!

А у тебя датасет, куда выбирается значение, открыт?
Если не получается, выложи куда-нибудь простой проект (на основе DBDEMOS), тебе скажут, где ошибка
Автор: Sleepwalker
Дата сообщения: 24.04.2006 16:21
либо тот источник, который идет как DataSourse, отключен, либо выставлен в ReadOnly.
Автор: SZap
Дата сообщения: 24.04.2006 16:58
Sleepwalker
DroN_S
Спасибо...
Автор: 31416
Дата сообщения: 24.04.2006 19:36
Sleepwalker

Цитата:
Цитата:
как востановить память которая принадлежала z?


указатель ты может и восстановишь, а вот будут ли там те же самые данные - вопрос.
а в чем глубинный смысл сей процедуры?


(это типа перебора с отходом назад - решаю задачу об упаковке в контейнеры)
у меня там рекурсивная ф-я когда она себя опять вызывает нужно чтобы она работала уже с другой областью памяти реализую я эт примерно так:

function gg(i:integer)
begin
//какие то вычисления с z
if (какие то условия) then
begin
sz.Push(z);
z:=allocmem(get_n);
gg(1);//вызываем себя но уже z указывает на другой участок памяти
z:=sz.Pop;//востанавливаем старый т.е хотелось бы востановить )))
end;

end;

хотелось бы сделать без асма...
Автор: Sleepwalker
Дата сообщения: 24.04.2006 21:18
31416
слушай, не могу дать гарантий, почему у тебя валится код, но у меня вот это работает без проблем:

var
Form1: TForm1;
z:^Integer;
implementation

procedure rec(i:integer);
begin
form1.memo1.Lines.add(inttostr(i));
new(z);
z^:=random(100);
asm
push z;
end;
form1.Memo1.lines.add('z: '+inttostr(z^));
if i<1000 then rec(i+1);
asm
pop z;
end;
form1.Memo1.lines.add('z: '+inttostr(z^));
dispose(z);
end;
Автор: 31416
Дата сообщения: 24.04.2006 22:36
Sleepwalker
Заменил я свой sz.Push(z); и z:=sz.Pop; на
asm
push z;
end;
и
asm
pop z;
end;

соответсвенно вот что инетерсно pop z - что в 1-м что во 2 -м случае не хочет работать, а push работает в обоих. Это если z:array of integer а не ^integer как в твоем примере.Хотя не совсем понятно чем они отличается ведь по сути то z:array of integer и естьуказатель на integer. (Или все не так просто?) Почему тогда компилятор не хочет его pop-нуть )))

Добавлено:
А вот что еще я обнаружил:
если описать так то pop работает!!!:

type
m = array of integer;
var
z:m;

но при этом появляется другая проблема
z:=allocmem(n); - первый раз когда вызываеш все ок
вычисления с z
push z
z:=allocmem(n); - а 2-й раз выдает ошибку invalid pointer operation отчего бы это??
вычисления с z
pop z //работает!!!
Автор: Sleepwalker
Дата сообщения: 25.04.2006 09:26
31416

type
m=array of integer;
var
z:^m;
procedure rec(i:integer);
begin
new(z);
setlength(z^,3);
z^[0]:=random(10);z^[1]:=random(90)+10;z^[2]:=random(899)+100;
form1.memo1.Lines.Add(inttostr(i)+'-'+inttostr(z^[2]+z^[1]+z^[0]));
asm
push z;
end;
if i<10000 then rec(i+1);
asm pop z;end;
form1.memo1.Lines.Add(inttostr(i)+'-'+inttostr(z^[2]+z^[1]+z^[0]));
dispose(z);
end;

работает на ура. насчет релиза памяти 100% не могу сказать, но, судя по показаниям системы, все освобождается нормально.

а ты уверен, что так, как ты работаешь, можно работать с динамическими массивами?
вообще, там есть функция setlength, которая занимается выделением памяти. это раз. Два: в функции allocmem указывается количество байт, а тип integer у нас так-то 4-х байтный
Автор: SergeBS
Дата сообщения: 25.04.2006 11:11
Налетел на вроде простую задачку, но как сделать - не приходит в голову .
Есть - кучка из 15-20 3-значных чисел типа 111, 112, 221 ... Каждому числу соответствует строка, его расшифровывающая. Надо - как-то вывести это безобразие попарно со скроллингом по числам, чтобы можно было прочитав описание, выбрать нужное число. Проблема в том, что строки расшифровки - разные по длине (от 20 до 300 символов), надо как-то разрезать/переносить длинные строки. Предложите мысль, как такое соорудить.
Автор: valerka78
Дата сообщения: 25.04.2006 11:39
SergeBS
А почему не сделать описание где-то сбоку? Т.е. выводить попарно с сокращенным описанием (или там порядковым номером), а при клике рядом в, допустим, Мемо, выводить полное описание?
Автор: dyr farot
Дата сообщения: 25.04.2006 11:41
можно использовать TListView с OwnerDraw = true и в OnDrawItem рисовать строку (DrawText -- в ней можно установить влаг переноса) со смещением на длину числа (TextWidth у TCanvas) а высоту строчки устанавливать OnMeasureItem (TextHeight у TCanvas).
Автор: YuRRiX
Дата сообщения: 25.04.2006 12:13
2 Sleepwalker

если Вы имели в виду так:

ShellExecute(GetDesktopWindow,'open',
'same_program.exe',nil,
'path2program',SW_Normal);

SetWindowPos(FindWindow(nil,'same_program_name'),
HWND_TOP,
GetSystemMetrics(SM_CXFULLSCREEN)-263,
GetSystemMetrics(SM_CYFULLSCREEN) + GetSystemMetrics(SM_CYCAPTION)-319,
263, 319,SWP_SHOWWINDOW);

то ничего не вышло...
Автор: SergeBS
Дата сообщения: 25.04.2006 12:49
valerka78

Цитата:

А почему не сделать описание где-то сбоку? Т.е. выводить попарно с сокращенным описанием

Эти 30-300 символов - и есть сокращенно .

dyr farot
Идею понял, но как-то оно то ли сложновато, то ли запутанно. Но в эту сторону посмотрю. Спасибо
Автор: Sleepwalker
Дата сообщения: 25.04.2006 13:46
YuRRiX
раз не вышло - значит что-то не так делаешь. сотни раз делал подобную процедуру вплоть до поиска невидимых полей на формах и проблем особых не было.
Это раз. Два: что именно не вышло? программа запустилась?
у меня эта строчка:
setwindowpos(findwindow(nil,'Form1'),HWND_BOTTOM,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE+SWP_SHOWWINDOW);
стработала нормально. Тебе надо только BOTTOM на TOP заменить.
Автор: YuRRiX
Дата сообщения: 25.04.2006 13:57
В том то все и дело, что программы запускаются и работают, но окно программы не отабражается! я думал, что это я наплутал в приложениях, и решил запускать так:
[cmd /c same_program.exe] -то есть как отдельный процесс! и все равно нет ни окна cmd ни окна моей проги. это значит особенность сервиса, встроенного в делфи...
пробывал запускать так:
---------------------------------------------------------------------
function ExecFile(fName: string; param: string): byte;
var
si : Tstartupinfo;
p : Tprocessinformation;
begin
if FileExists(fName) then result:=e__UnKnown else result:=e__FileNotFound;
Try
FillChar( Si, SizeOf( Si ) , 0 );
With Si do begin
cb := SizeOf( Si);
dwFlags := startf_UseShowWindow;
wShowWindow := 4;
end;
Createprocess(nil,Pchar(fName+' '+param),nil,nil,false,Create_default_error_mode,nil,nil,si,p);
Waitforsingleobject(p.hProcess,infinite);
except on exception do exit end;
result:=e__succes;
end;
----------------------------------------------------
те же проблемы, нет окна...
Автор: Sleepwalker
Дата сообщения: 25.04.2006 14:01
YuRRiX
эээ.. пардон, если у программы нет окна, то что ты собираешься показывать? наличие процесса не обязательно означает наличие окна приложения.
Автор: YuRRiX
Дата сообщения: 25.04.2006 14:33
если программу запускать ручками, или из другой программы, то окно есть! А из сервиса - нет!
Автор: vserd
Дата сообщения: 25.04.2006 14:57

Цитата:
если программу запускать ручками, или из другой программы, то окно есть! А из сервиса - нет!

А это помоему так и задумано. Там нужно выставлять флажок чтобы взаимодействовать с Desktop пользователя.
Автор: YuRRiX
Дата сообщения: 25.04.2006 15:08
Огромное ПАСИБА!
Автор: 31416
Дата сообщения: 25.04.2006 21:24
Sleepwalker ну вообщем ты все разрулил ))) так что спасибо.
Автор: reenoip
Дата сообщения: 26.04.2006 07:51
Ребята, допустим, загрузил я на на форму html страницу (через webbrowser, например, но это не важно), а там - 5 эдитов. Как мне программно забить в них текст, который хранится в моих пяти эдитах?
Т.е. чтобы текст моего первого эдита скопировался в первый эдит html страницы.


И ещё. На этой html странице есть кнопка. Как её можно программно нажать?

Благодарю.
Автор: Sleepwalker
Дата сообщения: 26.04.2006 10:43
reenoip
этого тебе должно хватить:


var
doc:IHTMLDocument2;
ielement:IHTMLElement;
i:integer;
inp:IHTMLInputElement;
subm:IHTMLElement;
begin
//забираем интерфейс документа
wb1.Document.QueryInterface(IID_IHTMLDocument2,doc);
//идем по всем элементам документа
for i:=1 to Doc.all.Get_length do begin
//получаем собственно сам элемент.
doc.all.item(i-1,0).queryinterface(IHTMLElement,ielement);
if assigned(iElement) then begin
iElement.QueryInterface(IHtmlInputElement,inp);
if assigned(Inp) then
begin
//если это эдит с именем field3 - записываем туда значение
if inp.name='field3' then inp.value:='MyVal';
//если это кнопка с именем submit - нажимаем ее.
if inp.name='Submit' then
begin
ielement.QueryInterface(IHtmlElement,subm);
subm.click;
end;
end;
end;
end;
...........

возможны варианты, тут кому как удобнее.

Добавлено:
можешь сюда еще заглянуть.
Автор: reenoip
Дата сообщения: 26.04.2006 11:26
На всякий случай, продублирую здесь:

В общем, для тех, кто хочет реализовать отправку sms с помощью своей программы...
У меня есть идея.
Не думаю, что она нова, но всё же.

Пойдём по порядку:

1. _http://www.beonline.ru/portal/comm/send_sms/simple_send_sms.sms - на этой странице можно отправить sms на билайн (сообщение доходит до адресата практически мгновенно). И есть защитный код. Он обновляется при каждом рефреше. НО! Защитный код можно узнать, причём - элементарно. Нужно всего лишь посмотреть "свойства" картинки (либо - клик правой кнопкой, либо - посмотреть данные гифа в уже загруженной страничке). Допустим, сейчас у меня показывается картинка с кодом "5009": _http://www.beonline.ru/servlet/send/confirm_code/KNL6WcKpkX.gif

2. В нашем случае имя гифа - "KNL6WcKpkX" - и есть тот самый код. Имя можно скопировать (не думаю, что это проблема). Главный косяк в том, что эдит ввода защитного кода имеет своё ограничение - позволяет ввести всего 4 символа (т.е. напрямую - вставкой - код не введёшь).

3. Здесь уже ответили, как можно ввести все необходимые данные в эдиты html страницы (например - номер телефона, текст сообщения) и имитировать нажатие кнопки ("Отправить"). Остаётся только обойти защиту, и всё.

Пути отхода:
- можно сделать кейген (что для меня не представляется возможным);
- можно попробовать обойти ограничение на ввод 4-х символов.




А теперь вопрос к тем, кто шарит больше и лучше меня
Реально ли такое вообще реализовать, или я пытаюсь объять необъятное?
Автор: OdesitVadim
Дата сообщения: 26.04.2006 12:26
reenoip

Цитата:
либо - посмотреть данные гифа в уже загруженной страничке). Допустим, сейчас у меня показывается картинка с кодом "5009": _http://www.beonline.ru/servlet/send/confirm_code/KNL6WcKpkX.gif

неполучиться
Берём этот адрес, бросаем в адресную строку. Видим картинку. Теперь нажимаем пару раз "обновить" и видим, что картинка меняется
Скорее всего, нужно куки читать.
Автор: reenoip
Дата сообщения: 26.04.2006 16:32
OdesitVadim, фак, точняк...
Ну, и ладно тогда, фиг с ним, с сервисом этим...
Вырасту - подумаю ещё раз )))
Автор: Dmitry
Дата сообщения: 27.04.2006 07:06
ArtemiyUO

Simple XML не пробовал?
http://mv.rb.ru

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.