Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
George J Можно создать в памяти мапированный файл с каким-то твоим именем и через него общаться. Лично по мне так проще. А вот как через переменные ты хотел общаться не особо понятно. Переменная - это участок памяти, зарезервированный за каким-то процессом.
Можно кстати даже через реестр общаться твоим программам Добавлено спустя 14 минут, 56 секунд George J Кстати можно еще посылать через сообщения:
Код:
{ You can perform communication between your application using Windows messages exchange mechanism. We can use HWND_BROADCAST value for first parameter for SendMessage function for suppressing finding of forms' in other applications HANDLE. For using HWND_BROADCAST we should register our messages in Windows. In example below we will inform about our form's top position)
Das Beispiel zeigt, wie zwischen zwei Applikationen eine Meldung (Message) verschickt werden kann. Die Meldung mit wird mit SendMessage verschickt. Der erst Parameter ist HWND_BROADCAST, beim zweite ist unsere Message. Das untenstehende Beispiel informiert z.B uber die Top-Position unserer Form}
// 1. Define type of your message structure, it could be something like this: // 1. Definiere eine eigene Message Struktur:
type TWMMYMessage = record Msg: Cardinal; // ( first is the message ID ) Handle: HWND; // ( this is the wParam, Handle of sender) Info: Longint; // ( this is lParam, pointer to our data) Result: Longint; end;
// 2. Override your form''s DefaultHandler method and add // method for handling your message, like this // 2. Die DefaultHandler Methode zu uberschreiben
// 3. Declare message variable: // 3. Die Message-Variablen deklarieren:
var WM_OURMESSAGE: DWORD;
// 4. Insert realisation of DefaultHandler and our message handler methods: // 4. DefaultHandler Implementation:
procedure TForm1.DefaultHandler(var Message); var ee: TWMMYMessage; begin with TMessage(Message) do begin if (Msg = WM_OURMESSAGE) then begin ee.Msg := Msg; ee.Handle := wParam; ee.Info := lParam; // Checking if this message is not from us if ee.Handle <> Handle then WMMYMessage(ee); end else inherited DefaultHandler(Message); end; end;
procedure TForm1.WMMYMessage(var Msg: TWMMYMessage); begin label1.Caption := Format('Our another form handle :%d', [Msg.Handle]); Label2.Caption := Format('Our another form top :%d', [Msg.Info]); end;
// 5. Add registration of your message that you could // handle the HWND_BROADCAST messages: // 5. Die Message registrieren.
Member
Статус: Не в сети Регистрация: 11.07.2004 Откуда: Воронеж
Как сделать что бы при сохранении файла, к его имени добавлялось расширение, выбранное в SaveDialog.
А то получается если явно не укажешь расширение в имени файла то он и сохранить без него, хотя расширение выбрано.
DefaultExt к сожалению только одно расширение добавляет.
ну вот я его заполнил это свойство, а сохранялка не сохраняет файл с выбранным расширеним в фильтре:)))
Упс… "cохранялка" тока для выбора файла. А файл сохраняешь сам – "руками".
Код:
procedure TForm1.btnSaveClick(Sender: TObject); var SL: TstringList; SD: TSaveDialog; begin SL:= TstringList.Create; SD:= TSaveDialog.Create(Self); SD.DefaultExt:= '.txt'; SD.Filter:= 'Текстовый документ|*.txt|Пакетный файл MS-DOS|*.bat'; // Добавляем данные для *.txt и *.bat файлов. if SD.Execute then begin SL.Add('бла-бла-бла...'); SL.Add('Справка рулит...'); SL.SaveToFile(SD.FileName); // Типа вот - сохранение содержимого экземпляра TStringList в файл. ;) end; SD.Free; SL.Free; end;
Только поясни почему так работает, а указав фильтр статически, в свойствах, не работает?
У меня работает. ИМХО это где-то твои "грабли". Посмотри свой dfm-файл, на предмет сохраненных свойств. *.dfm является файлом ресурсов и при компиляции присоединяется к приложению также, как и другие ресурсы. Разработчик компонента может, конечно, явно указать, какие свойства не нужно сохранять. Для этого используется директива Stored (False/True). Также значение поля не сохраняется, если значение директивы Default соответствует текущему значению поля. Но это явно не твой случай.
Koval писал(а):
первый раз такое вижу в жизни
resourcestring -> такой себе вид ресурса, известный как таблицы строк.
Member
Статус: Не в сети Регистрация: 11.07.2004 Откуда: Воронеж
_SGK писал(а):
У меня работает. Smile ИМХО это где-то твои "грабли".
хм... сижу и ржу.... Удалил процедуру TfrmExtNotePad.FileSaveAs1Accept
потом по новой создал и все заработало без дополнительных ухищрений...
странное явление....
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Люди, плиз помогите. Прописался у меня дебаггер от Дельфи как стандартный дебаггер на всю систему. Мягко говоря стало не удобно, если какое-то приложение упало, а я в это время в Дельфи сижу и работаю. Инстала Дельфи нет, винду точно не переустановить. Как подправить, чтобы стандартный mdm запускался?
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
_SGK Ок, спс. Я правда вчерась нашел уже эту запись, правда в поле debugger ничего не писал, но исправил поле auto с 1 на 0. И хоть ничего не запускается при том, как слетает приложение.
Но в любом случае спс и
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
здрасте, большая просьба не ржать надо мой, ибо я тока учусь
не коректно работает следующая прога, использующая бинарный поиск в массиве:
Код:
function GetArray: mass; var i: integer; begin for i:=1 to maxarrsize do if Length(Form1.StringGrid1.Cells[i-1,0])=0 then Result[i]:=0 else Result[i]:=StrToInt(Form1.StringGrid1.Cells[i-1,0]); end;
procedure TForm1.Button1Click(Sender: TObject); var arr: mass; upborder,downborder,downdivup: integer; i,exs,index: integer; begin arr:=GetArray; exs:=StrToInt(Edit1.Text); upborder:=1; downborder:=maxarrsize; index:=0; repeat begin downdivup:=((downborder-upborder) div 2)+1; if arr[downdivup]=exs then index:=downdivup; if index=0 then if exs>downdivup then begin upborder:=downdivup+1; downborder:=downborder-1; end else begin downborder:=downdivup-1; upborder:=upborder+1; end; end; until ((upborder=downborder) or (index<>0)); if index=0 then MessageDlg(' ìàññèâå ÷èñëî '+IntToStr(exs)+' íå îáíàðóæåíî', MtInformation,[mbOk],0) else Label2.Caption:='Íîìåð ýëåìåíòà '+IntToStr(exs)+' ðàâåí '+IntToStr(index);
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
HardMan Я не совсем понял саму программу. У тебя есть массив в стринггриде, а что у тебя в Edit1? Искомое число?
И вообще, нафиг такие сложности то для бинарного поиска? Тем паче для бинарного поиска нужно, чтобы массив был отсортирован. Ты надеюсь это знал?
И почему не воспользоваться "поиском Фибоначчи" к примеру? Такого же типа, только побыстрее получиться.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
HardMan Итак, поехали.
Поиск Фибоначчи, или интерполяцонный поиск, или
Код:
Function TCryogenOptAPI.InterpolationSearch(Target: Longint; Min, Max: Longint): Longint; Var Middle: Integer; ZnMin, ZnMax, ZnMiddle: Integer; Begin While (Min <= Max) Do Begin ZnMin := GetOLFData(Min).Id; ZnMax := GetOLFData(Max).Id; // Предотвращение деления на нуль. If (ZnMin = ZnMax) Then Begin // Это должен быть искомый элемент (если он есть в списке) . If ZnMin = Target Then Result := Min Else Result := 0; Exit; End;
// Удостовериться, что мы не вышли за пределы диапазона. If ((Middle < Min) Or (Middle > Max) ) Then Begin // Элемента в списке нет. Result := 0; Exit; End; ZnMiddle := GetOLFData(Middle).Id; If Target = ZnMiddle Then // Элемент найден. Begin Result := Middle; Exit; End Else If Target < ZnMiddle Then // Перебор левой половины. Max := Middle - 1 Else // Перебор правой половины. Min := Middle + 1; End; // Конец while (min <= max) do. . .
// Если мы достигли этой точки, то элемента в списке нет. Result := 0; End;
Итак, на входе Target - искомое число, Min - индекс минимального элемента в массиве, Max - индекс максимального элемента массива. Сам массив у меня вытаскивается с помощью типа - GetOLFData(Min).Id (это просто динамический массив, где каждая ячейка массива - запись).
Бинарный поиск
Код:
function BinarySearch(target : Longint; List : PLongArray; min, max : Longint) : Longint; var middle: Longint; begin searches := 0; // Во время поиска индекс искомого элемента будет между min и max: // min <= искомый индекс <= max. while (min <= max) do begin searches := searches + 1; middle := Round((max+min) / 2); if (target = list^[middle]) then // Мы нашли его. begin Result := middle; exit; end else if target < List^[middle] then // Перебираем левую половину. max := middle - 1 else // Перебираем правую половину. min := middle + 1; end; // Если мы оказались здесь, то искомого элемента в списке нет. Result := 0; end;
Теперь стало быть сортировка (сортировка слиянием, есть еще пирамидальная сортировка, только не довел до ума, иногда глючит):
Код:
Const Cutoff = 10;
Procedure TCryogenOptAPI.SelectionSort(List: PLongintArray; Min, Max: Longint); Var I, J, Best_Value, Best_J: Longint; Begin For I := Min To Max - 1 Do Begin // Нахождение наименьшего из оставшихся элементов. Best_Value := List^[I]; Best_J := I; For J := I + 1 To Max Do If List^[J] < Best_Value Then Begin Best_Value := List^[J]; Best_J := J; End; // Перемещение его в нужную позицию. List^[Best_J] := List^[I]; List^[I] := Best_Value; End; End;
Procedure TCryogenOptAPI.MergeSort(List, Scratch: PLongintArray; Min, Max: Longint); Var Middle, I1, I2, I3: Longint; Begin // Если список содержит не более Cutoff элементов, // останавливаем рекурсию и используем сортировку выбором. If (Max - Min < Cutoff) Then Begin SelectionSort(List, Min, Max); Exit; End; // Рекурсивно сортируем подсписки. Middle := Max Div 2 + Min Div 2; MergeSort(List, Scratch, Min, Middle); MergeSort(List, Scratch, Middle + 1, Max);
// Объединение сортированных списков. I1 := Min; // Указатель на список 1. I2 := Middle + 1; // Указатель на список 2. I3 := Min; // Указатель на объединенный список. While ((I1 <= Middle) And (I2 <= Max)) Do Begin If List^[I1] <= List^[I2] Then Begin Scratch^[I3] := List^[I1]; I1 := I1 + 1; End Else Begin Scratch^[I3] := List^[I2]; I2 := I2 + 1; End; I3 := I3 + 1; End; // Очистка списка, который еще не пустой. While (I1 <= Middle) Do Begin Scratch^[I3] := List^[I1]; I1 := I1 + 1; I3 := I3 + 1; End; While (I2 <= Max) Do Begin Scratch^[I3] := List^[I2]; I2 := I2 + 1; I3 := I3 + 1; End; // Перемещение объединенного списка в исходный список. For I3 := Min To Max Do List^[I3] := Scratch^[I3]; End;
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 03.03.2006 Откуда: Москва
Добрый день, у меня такой вопрос, можно ли в компеляторе Delphi отключить сообщения об ошибках. Т.е. во время работы программы переодически появляется не кретичная ошибка сообщающая о том, что программа не может получить доступ к файлу. Но при этом работа самой программы не прерывается, это ошибка очень раздрожает пользователя! Есть ли возможность перед компелированием отключить функцию вывода ошибок. Заранее всем спасибо!!!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Dr.Alc_H>W Просто твой код работы с файлом нужно поместить в код типа:
Код:
try .... except end;
Но нужно ли именно так писать, может лучше как-нибудь по другому - например чуть пересмотреть код и просто не открывать файл, который нельзя открыть. Ну что-то типа:
Код:
AssignFile(F, 'myfile.txt'); {$I-} Rewrite(F); {$I+} If IOResult <> 0 Then Begin //твой код, когда файл не создался End Else Begin //твой код, когда файл создался и можно в него писать инфу CloseFile(F); End;
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения