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

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: psa1974
Дата сообщения: 20.12.2009 00:45
mauar

Цитата:
Мне нужно чтобы эти переменные в memo указывались в случайном произвольном порядке.

Алгоритм: объявляешь массив из 10 строковых элементов, инициализируешь его своими "5 переменными с именами s1..s5" и "5 переменными с именами a1..a5". Затем пересортировуешь элементы массива случайным образом и формируешь строку, подряд выбирая все 10 элементов массива.
[more=смотри здесь вариант решения]

Код: procedure TForm2.Button1Click(Sender: TObject);
var
a: array[0..9] of string;
i: Shortint;
RandInx: Integer;
s: string;
begin
Memo1.Lines.Clear;
// тут ты в массив заносишь свои 10 значений. Для простоты в примере я
// инициирую масив последовательными цифрами от 0 до 9:
for i := Low(a) to High(a) do
a[i]:= IntToStr(i);
// пересортировуем элементы массива случайным образом:
Randomize;
for i := Low(a) to High(a)- 1 do
begin
RandInx := Random((High(a)-Low(a)+ 1) - i);
s:= a[i];
a[i]:= a[RandInx];
a[RandInx]:= s;
end;
// вывод результата:
s:= '';
for i := Low(a) to High(a) do
s:= s+ a[i];
Memo1.Lines.Add(s);
end;
Автор: SIgor33
Дата сообщения: 21.12.2009 09:23
volser

Цитата:
Посмотрите функцию WNetAddConnection.

А примерчик можно
Автор: ShIvADeSt
Дата сообщения: 21.12.2009 09:42
SIgor33

Цитата:
А примерчик можно

Ндас, а на гугле забанили?

Код:
Подключить сетевой ресурс:
WNetAddConnection(NetResourse, Password, LocalName: PChar): longint;
где
1. NetResourse - имя сетевого ресурса (например '\\P166\c')
2. Password - пароль на доступ к ресурсу (если нет пароля, то пустая строка)
3. LocalName - имя, под которым сетевой ресурс будет отображен на данном компьютере (например 'F:')
Пример подключения сетевого диска:
WNetAddConnection('\\P166\C', '', 'F:');
Автор: data man
Дата сообщения: 21.12.2009 10:05
SIgor33

В dsiwin32.zip есть такие функции, возвращающие true в случае "удачи":
function DSiConnectToNetworkResource(const networkResource: string; const mappedLetter: string; const username: string; const password: string): boolean;
function DSiDisconnectFromNetworkResource(mappedLetter: char; updateProfile: boolean = false): boolean;
Автор: SIgor33
Дата сообщения: 21.12.2009 12:06
ShIvADeSt
data man
Спасибо огромное
Автор: VandB
Дата сообщения: 22.12.2009 14:46
Уважаемые "форумчане", те кто работает с 3D не сочтите за трудность, помогите пожалуйста.
Вот здесь : http://forum.ru-board.com/topic.cgi?forum=33&topic=10849#lt .
Заранее спасибо.
(Вопрос непосредственно по Delphi)
Автор: straxxx
Дата сообщения: 23.12.2009 00:16
помоги кодом
вопрос довольно прост:
как запретить запуск более 2х exe?
спасибо за скорый ответ)
Автор: ShIvADeSt
Дата сообщения: 23.12.2009 01:31
straxxx
При старте сделать перечисление процессов. Если процессов более двух, то завершаться. Либо -
стартуем процесс, процесс пытается создать мьютекс например MyCoolMutex1. Если все ок - то запускаемся, если нет - то пытаемся создать MyCoolMutex2. Если все нормально, то мы второй процесс - и запускаемся. Если опять обломинго - то увы, мы третий процесс и выходим.
Автор: straxxx
Дата сообщения: 23.12.2009 09:18
ShIvADeSt
спасибо...а как это будет выглядеть ввиде кода на Delphi 5 или 7
Автор: ShIvADeSt
Дата сообщения: 23.12.2009 09:54
straxxx

Код:
CreateMutex(nil, false, 'MyTestMutex1');
if GetLastError=ERROR_ALREADY_EXISTS then begin
CreateMutex(nil, false, 'MyTestMutex2');
if GetLastError=ERROR_ALREADY_EXISTS then Halt(0);
end;
Автор: delover
Дата сообщения: 23.12.2009 10:27
greenpc

Цитата:
имхо сам разработчик должен ловить свои баги.

Да я не разработчик. У меня в Delphi 2006 всё работает, а у него видимо был "косяк" с оформлением PackageWizard. В Delphi 5 это делалось с помощью процедуры, сейчас можно по другому, а вот выше Delphi 2006 видимо старый способ приводит к умиранию процесса, так как после компиляции пакета его приходится перезагрузить, а визард устанавливая старым способом нельзя было потом выковырять. А в Дэльфях выше его надо выковыривать обязательно, иначе IDE-хе плохо.
Автор: zakov
Дата сообщения: 23.12.2009 15:07
Подскажите, может кто сталкивался!?
Как в dbGrid изменить предопределенную реакцию на нажития клавиш. Т.е. вместо установленных действий на нажатие Enter, Tab, Esc, Down, Up, Left, Right, при нажатии на символьные и цифровые клавиши dbGrid не должен входить в режим редактирования.
Хочется сделать не обходными путями, как то обработка KeyPress и KeyDown, а переопределить методы компонента. Может кто знает где копать в source?
Автор: ShIvADeSt
Дата сообщения: 24.12.2009 01:37
zakov
В свойствах Гриды (там где всякие RowSelect) отключи Editing и будет тебе счастье.
Автор: zakov
Дата сообщения: 24.12.2009 01:46

Цитата:
zakov
В свойствах Гриды (там где всякие RowSelect) отключи Editing и будет тебе счастье.


Я так и сделал. Только коряво получается. Пользователю надо оставить возможность редактировать данные в гриде.
Я сделал так, что по нажатию определенных клавиш или дбл клике на ячейке обработчик делает грид редактируемым, при смене строки грид опять делаю не редактируемым. Для добавления строки по кнопке вниз опять таки обработчик, так как грид постоянно не редактируемый, а надо, чтобы это срабатывало.
Так вот, куча кода получается. И мне это богатство нужно во всех формах проекта. Поэтому я и хочу изменить компонент, а как и где незнаю. Опыта по написанию компонент у меня нет.
Может кто поможет, желательно кодом...
Автор: MoBiRo
Дата сообщения: 24.12.2009 07:11
Proxy для TWebBrowser в Delphi 7
Хочу сделать переход на страницу под проксей, но никак не могу этого добиться. В гугле всё время нахожу два примера, больше не нашел. Пытаюсь их использовать - или выдаёт ошибку , или не работает =\ Вот ссылка на проект в Delphi 7 (5,9 kb) http://files.wyw.ru/wyw_file?id=4185922
Всё должно быть легко, но я полдня на гугл убил.
Автор: MoBiRo
Дата сообщения: 25.12.2009 09:06
О, я разобрался =)
Автор: ppkp
Дата сообщения: 25.12.2009 10:11
Как отличить tkFloat обычый double или TDateTime ?

case PropInfo^.PropType^.Kind of
tkFloat:
Result := FormatFloat('#0.00', GetFloatProp(Self, PropInfo));
//а если TDateTime
Result := FormatDateTime('dd.mm.yy', GetFloatProp(Self, PropInfo))
Нигде не нашел что-то типа tkDateTime

Автор: LordMAD
Дата сообщения: 26.12.2009 13:08
ppkp

Цитата:
Как отличить tkFloat обычый double или TDateTime ?


Код: if PropInfo^.PropType^ = System.TypeInfo(TDateTime) then ...
Автор: ppkp
Дата сообщения: 26.12.2009 17:28
LordMAD

Цитата:
:if PropInfo^.PropType^ = System.TypeInfo(TDateTime) then ...

Спасибо, все заработало. Только System я опустил.
В общем, нужно было взять второе поле у PropInfo^.PropType^ - не Kind, а Name.

Только тогда теряется красота case и нужно не промахнуться с 'Double' (не double)
....
end else if PropInfo^.PropType^.Name = 'Double' then begin...

PS Зато нет заморочек с tkLString (в D2007) и tkUString (в D2010)
Спасибо.
Автор: V1s1ter
Дата сообщения: 28.12.2009 13:56
Мужики, вылечите мне голову, или нервы.
Был проект под ТР7, портировали под Д2007.
Все работало, мы его дополняли и т.д.
И вот в один день стал вылетать в одном месте. , А именно
если есть код такой

Код: var
I: Byte;
L: Integer;
begin
try
L := 0;
for I := 0 to L - 1 do begin
сюда заходит.
end;
Автор: data man
Дата сообщения: 28.12.2009 14:19
V1s1ter
Потому что нежелательно использовать в циклах FOR переменные беззнаковых типов.
Особенно, когда есть выражение вида Length - 1.
В первом цикле 0 - 1 = 255 и будет 256 итераций, что неправильно - должно быть ни одной.
А во втором всё правильно.
А вообще при сравнении лучше избегать смешивания знаковых и беззнаковых типов.
Есть хороший пост и комментарии к нему http://alex.ciobanu.org/?p=175
Автор: V1s1ter
Дата сообщения: 28.12.2009 15:21
data man
Все правильно, но сдругой стороны где пресловутое преобразование типов и почему полгода работало?...
Автор: data man
Дата сообщения: 28.12.2009 15:33
V1s1ter

Цитата:
а потом вдруг стало вылетать?

Вылетает на этапе компиляции или выполнения программы ?
Опции проекта менялись ? В частности "R- Range checking" ?
Автор: zakov
Дата сообщения: 28.12.2009 23:18
Знатоки, помогите!

Почему у меня сообщение WM_SETTEXT не перехватывается?
Вот код:

Код: // реализация оконной процедуры управления дочерним окном,
// на которую заменена стандартная процедура
procedure TzakWindowBarButton.ChildWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_SETTEXT: // установка заголовка окна
begin
showMessage('Смена заголовка!');
end;
WM_SETICON:
begin
showMessage('Смена иконки!');
end;
wm_Destroy: // уничтожается окно
begin
Destroy;
end;
wm_MDIActivate:
begin
down:=true;
end;
end;
// вызов стандартного (старого) метода обработки сообщения для обработки сообщения
Message.Result:= CallWindowProc(OldChildWndProc, Fwindow, Message.Msg, Message.WParam, Message.LParam);
end;
Автор: V1s1ter
Дата сообщения: 28.12.2009 23:25
data man
Спасибо за участие. Разобрался сам, а то уж перенервничал. Просто все это время были такие данные, что указанный цикл ни разу не вызывался!
Прошу прощения, что побеспокоил - дюже перенервничал я, проект то серьезный , а тут такие "непонятки".

Добавлено:
zakov
Вникать где грабли пока времени нет, но вот так работает:

Код: TMDIChild = class(TForm)
procedure WndProc(var Message: TMessage); override;
....
procedure TMDIChild.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_SETTEXT then begin
чегото делаем
end;
inherited;
end;
Автор: zakov
Дата сообщения: 29.12.2009 00:21
V1s1ter

Да у меня тоже так работает
а как его перехватить в другом компоненте?
Фактически в моем коде, приведенном выше, делается тоже самое. Метод WndProc для дочерних окон подменяется моей реализацией, из которой вызывается подмененый после моих каких-то действий. Но так почему-то не работает ...
Код-то такойже или я что-то недопонимаю???
Автор: V1s1ter
Дата сообщения: 29.12.2009 01:21
zakov
Чего то я не понял, что на что у вас подменяется. Я не нашел в исходниках ChildWndProc который Вы подменяете. Что значит
Цитата:
как его перехватить в другом компоненте

Если сообщение передается окну, то до кнопки оно может и не дойти, чтобы дошло, нужно в обработчике сообщений окна сгенерировать новое сообщение и отправить его кнопке.
Автор: zakov
Дата сообщения: 29.12.2009 01:34
Пишу компонент, у которого определена процедура, на которую при создании объекта подменяется метод WndProc дочернего окна

Код:
constructor TzakWindowBarButton.Create(AOwner: TComponent;
WindowHandle: THandle);
begin
Create(AOwner);
Fwindow := WindowHandle;

// получение указателя на новую процедуру
InstanceChildWndProc := MakeObjectInstance(ChildWndProc);
// установка новой оконной процедуры для дочернего окна и сохранение указателя на старую процедуру
OldChildWndProc := Pointer(SetWindowLong(WindowHandle, GWL_WNDPROC, Longint(InstanceChildWndProc)));
end;
Автор: 90Kinoman
Дата сообщения: 29.12.2009 16:08
Вычислить высоты треугольника со сторонами а, b, с.
Автор: JohnSilver182
Дата сообщения: 29.12.2009 16:45
Hi All
А есть у кого пример кода создания динамически формы и передача ей каких либо параметров ???

Я просто по имени формы могу создать из любого модуля без Тонн USES ,
НО !! параметры приходиться пересылать через SendMessages


Код: procedure TDM.FormLoaderMDI (const FormName:String;)
var
I:integer;
//F: TCustomForm;
F:TForm;
bExists:boolean;
begin
try
bExists:=false;
for I := 0 to Screen.FormCount - 1 do
if Lowercase('t'+Screen.Forms[i].Name)= Lowercase(FormName) then
begin
bExists:=true;
F:=Screen.Forms[i];
end;

if bExists=false then F := TFormClass(FindClass(FormName)).Create(Application)
else
f.BringToFront;
f.Visible:=true;
finally
end;

end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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