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

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

Автор: psa1974
Дата сообщения: 13.12.2009 20:30
Всем заинтересованным к сведению
Как многие, вероятно, заметили, топик обзавелся шапкой. Поскольку шапка есть, она должна быть оформлена .
Здесь находится ПРОЕКТ ШАПКИ
Обсуждаем оформление, делаем предложения относительно содержания...
Автор: Grande
Дата сообщения: 15.12.2009 13:36
Имеется код:

Код:
var
RName, RAddr: PChar;
LCnt, RecipCtr: Integer;
AddrStr: Char;
Ft: TextFile;
Tmp: string;
RecipNames, RecipAddr: Array of PChar;
begin
if FileExists(ExtractFilePath(ParamStr(0)) + 'Recips.txt') then
begin
System.AssignFile(Ft, ExtractFilePath(ParamStr(0)) + 'Recips.txt');
System.Reset(Ft);
Readln(Ft, Tmp);
LCnt := StrToInt(Tmp);
SetLength(RecipNames, LCnt);
SetLength(RecipAddr, LCnt);
RecipCtr := LCnt + 1;
LCnt := 0;
while not Eof(Ft) do
begin
Readln(Ft, Tmp);
RName := PChar(Trim(Copy(Tmp, 1, Pos('|', Tmp) - 1)));
RAddr := PChar(Trim(Copy(Tmp, Pos('|', Tmp) + 1, 30)));
RecipNames[LCnt] := RName;
RecipAddr[LCnt] := RAddr;
inc(LCnt);
end;
System.CloseFile(Ft);
end;
Автор: data man
Дата сообщения: 15.12.2009 14:07
Grande

Лучше заменить на:

Код: RecipNames, RecipAddr: Array of string;
Автор: Grande
Дата сообщения: 15.12.2009 14:09
data man
Я так и сделал. Но любопытно, все же, почему так происходит...
Автор: V1s1ter
Дата сообщения: 15.12.2009 15:07
Grande
Пишу в дороге потому может гдето нетак понял, но помоему проблема тут:
RName := PChar(Trim(Copy(Tmp, 1, Pos('|', Tmp) - 1)));
Выделен ВРЕМЕННЫЙ фрагмент памяти и передан указатель на него RName
RecipNames[LCnt] := RName;
Сохранили указатель на этот временный фрагмент.
Гдето менеджер памяти посчитал, то ранее выделенная память не нужна и чегото в нее писанул и естественно потер все RecipNames[i].
В случае когда RecipNames типа String, то при RecipNames[LCnt] := RName; произойдет копирование из ВРЕМЕННОГО фрагмента в память выделенную под RecipNames[LCnt].
Вроде так.

Автор: Grande
Дата сообщения: 15.12.2009 15:12
V1s1ter

Цитата:
потер все RecipNames[i]

Не совсем так: RecipNames[i] остается на месте, только в конце строки появляется мусор.
Автор: V1s1ter
Дата сообщения: 15.12.2009 15:55
Grande

Цитата:
Не совсем так: RecipNames[i] остается на месте, только в конце строки появляется мусор.

Что перезаписывается и как зависит от распределения памяти, возможно что временные выделенные участки и не понадобятся до окончания работы программы и создается июзия корректно написаной программы. Видимо в Вашем случае понадобился участок памяти который пересекался с выделенным временным фрагментом всего одним символом. Повлиять на распределения можно просто, например обявите локальную переменную типа String[200] вызови пару функций по по обработке этой строки между вызовами
RAddr := PChar(Trim(Copy(Tmp, Pos('|', Tmp) + 1, 30)));
--->
RecipNames[LCnt] := RName;
и ВОЗМОЖНО RecipNames[i] будет вести себя уже по другому.
Вообщето мой ответ касался работы с указателями:
Функция Trim() выделяет фрагмент памяти в стеке вызова процедур и возвращает указатель на этот фрагмент, а стек постоянно меняется.
Автор: nickjust
Дата сообщения: 15.12.2009 16:45
Есть мысля ...Нужен программер ,который бы написал
Есть куча солюх ,разного качества,которые по сто раз качаем перекачиваем..
пора унифицировать..
Берем хорошего качества фотку мобилы в формате PSD (многослойная картинка в формате PhotoShop) - это будет 1 слой ..
Потом все солюхи ,легко и просто добавляем в фотошопе - слоями
Например солюха "Нет звука полифонии" - слой номер 2
Нужна утилита,которая бы открывала PSD файл в отдельном окне,и выводила 1 слой в окне,потом автоматически считывала количество слоев и по бокам рисовала кнопки с названиями,(названия брать из ini файла который лежит рядом с файлом Psd - типа Nokia3310.psd и Nokia3310.ini)
Нажимаем кнопу "Нет звука полифонии" и на основной слой накладывается 2 слой..


ИТОГ - 1 утилита которая выводит на экран солюхи и 1 картинка в формате PSD + 1 файл для кнопок INI - для 1 тела!
__________________
Автор: Hiken
Дата сообщения: 15.12.2009 17:00
nickjust
Можно перевести на человеческий язык? Что за солюхи и причем тут Delphi? Конечно понимаю, программазм накладывает отпечаток, да и заработаться каждый может, но все же - постарайтесь.
Автор: Frodo_Torbins
Дата сообщения: 15.12.2009 18:11
Grande
Добавил к вашему коду:

Код: [no]for I := low(RecipNames) to high(RecipNames) do
Memo1.Lines.Add(recipnames[i]); //<- на первой итерации AV[/no]
Автор: nickjust
Дата сообщения: 15.12.2009 22:06
2Hiken
Сорри ...рапортую
Солюха - производная от Solution
Картинка схемы или фото мобильного телефона,где доступно нарисовано что и как сделать ,чтобы исправить ту или иную неисправность!
WBR!
Автор: ShIvADeSt
Дата сообщения: 16.12.2009 01:33
nickjust
Вверху тема предложение по работе для программистов. Если ты считаешь что работа с PSD файлами на Дельфи - это типовая задача, то :поклонение: Либо создавай отдельную тему и сам пытайся что то сделать, либо предлагай оплату.
Автор: Frodo_Torbins
Дата сообщения: 16.12.2009 12:12
nickjust
Действительно PSD очень неудобный формат. Как минимум для запуска программы каждому пользователю потребуется ставить фотошоп. Лучше выбрать что-нибудь из этого списка: http://galfar.vevb.net/imaging/doc/html/fileformats.html Основные требования со стороны программиста: поддержка прозрачности, возможность запихнуть несколько картинок в один файл. То есть например gif подходит.
Автор: Grande
Дата сообщения: 16.12.2009 17:57
Frodo_Torbins
Понял... Как говорится - век живи, век учись
Спасибо, уважаемые.
Автор: Vostrikovskiy
Дата сообщения: 17.12.2009 00:02
Frodo_Torbins

Цитата:
То есть например gif подходит.

10-ка tiff поддерживает.
Автор: V1s1ter
Дата сообщения: 17.12.2009 01:49
Frodo_Torbins
Vostrikovskiy

Цитата:
Действительно PSD очень неудобный формат

Мужики, но Вы ведь серьезные люди и прекрасно понимаете, что при такой постановке задачи, любые разговоры это флуд, а для этой темы видимо и офттоп.
Автор: Vostrikovskiy
Дата сообщения: 17.12.2009 14:05
V1s1ter
Я указал на самый мощный универсальный графический формат, который впервые появился в 2010. Мне кажется, что это к прикладному программированию имеет прямое отношение. В чем я не прав?
Автор: andrewtishkin
Дата сообщения: 17.12.2009 16:59
Немного оффтопик, про форматы и D2010

Цитата:
10-ка tiff поддерживает

Хм, в твиттере добавили ссылку на запись в блоге о новых форматах, поддерживаемых в "десятке", в частности про поддержку RAW говорят (правда не напрямую, но всё же)
http://blogs.embarcadero.com/matthiaseissing/2009/12/15/38566

Цитата:
New in 2010!
Support for Windows Imaging Component (WIC) including JPEG, TIFF, GIF, PNG, BMP and HD Photo image formats. RAW camera formats (such as NRW, NEF, CRW, CR2, RW2, ARW, SR2, SRF, ORF, PEF and DNG) also supported with manufacturer supplied codecs.
Автор: Grande
Дата сообщения: 18.12.2009 09:20
Стоит у меня пиратская Delphi7. А на днях появилась лицензионная. Подскажите, пожалуйста, как поменять пиратский ключик на купленный?
Автор: volser
Дата сообщения: 18.12.2009 10:21
Grande
А смысл менять ключик, если и так все работает. Лицензия нужна только проверяющим органам.
Автор: Grande
Дата сообщения: 18.12.2009 10:51
volser

Цитата:
Лицензия нужна только проверяющим органам.

Вот-вот, и я про то же - пиратка-то на работе
Автор: SIgor33
Дата сообщения: 18.12.2009 11:21
Есть папка на сервере в которую ограниченный доступ для пользователей(только для чтения) и учетка имеющая права на запись. Необходимо из приложения, запущенного под учеткой пользователя имеющего ограниченый доступ к папке на сервере, программно скопировать с компа пользователя файл в эту папку на сервере. Какие есть предложения?
Автор: volser
Дата сообщения: 18.12.2009 11:29
SIgor33
Подключится к папке с нужным пользователем. Посмотрите функцию WNetAddConnection.
Автор: pakusya
Дата сообщения: 18.12.2009 15:14
Здравствуйте. Пожалуйста подскажите, что здесь не так, почему форма через 30 секунд не меняет цвет? И как сделать чтобы через 40 секунд раздавался звуковой сигнал, а через 1 минуту появлялся вопрос о продолжении работы.
procedure TForm1.Button1Click(Sender: TObject);
begin
if Timer1.Interval=2000 then
Form1.Color:= Form1.Color;
Form1.Color:=Random($FFFFFF);
Timer1.Enabled := True;
// Timer.Interval в милисекундах
Timer1.Interval := 2000;
Timer1.OnTimer := DrawCircle;
Timer1.Enabled := True;
end;
procedure TForm1.DrawCircle(Sender: TObject);
var
X, Y, R: Integer;
shar: TColor;
begin
Form1.Refresh;
X := Random(Min(ClientHeight, ClientWidth)); // чтобы центр не выходил за пределы клиентской части окна
Y := Random(Min(ClientHeight, ClientWidth)); // чтобы центр не выходил за пределы клиентской части окна
R := Random(Min(ClientHeight, ClientWidth)) div 2; // чтобы радиус был меньше половины клиентской части окна
shar := TColor(Random($FFFFFF));
Canvas.Ellipse(X-R, Y-R, X+R, Y+R);
Canvas.Pen.Color := Form1.Color;
Canvas.Pen.Color :=shar;
Canvas.Brush.Color :=shar;
Canvas.Ellipse(X-R, Y-R, X+R, Y+R);
end;


Автор: volser
Дата сообщения: 18.12.2009 15:32
pakusya
Рисовать нужно в методе Paint формы. А вообще странный какой то код.
Автор: pakusya
Дата сообщения: 18.12.2009 15:40
но он работает,разноцветные шары периодично появляются и исчезают, но форма не меняет цвет и остальное до меня тоже не доходит.
Автор: V1s1ter
Дата сообщения: 18.12.2009 18:33
volser

Цитата:
Рисовать нужно в методе Paint формы. А вообще странный какой то код.

Не нужно, это у них лаба такая - на таймер.

pakusya
Солнышко, я написал Вам только одно решение, в надежде, что остальное Вы сделаете хотябы по образу и подобию. Однако не прошло и полгода и Вы снова здесь....
Я готов рассказать, что и как делать, если Вы готовы учиться. Сделать за Вас всю работу мне не дают религиозные убеждения.
Автор: psa1974
Дата сообщения: 18.12.2009 19:35
pakusya
И снова здрасте

Цитата:
почему форма через 30 секунд не меняет цвет?

Потому что нигде это ей не сказано делать. [more=Разбор Вашего кода здесь]
код Button1Click:

Код: procedure TForm9.Button1Click(Sender: TObject);
begin
if Timer1.Interval=2000 then
Form1.Color:= Form1.Color; // бесполезная строка - ничего не делает!
Form1.Color:=Random($FFFFFF); // тут мы один раз меняем цвет формы случайным образом
Timer1.Enabled := True; // лишняя строка - во первых при изменении Timer1.Interval сам таймер по-любому перестартовывает, во вторых чуть ниже встречается еще раз эта же строка (вот там она как раз к месту!)
// Timer.Interval в милисекундах
Timer1.Interval := 2000;
Timer1.OnTimer := DrawCircle; // назначаем обработчик события для таймера
Timer1.Enabled := True; // включаем таймер
end;
Автор: pakusya
Дата сообщения: 19.12.2009 02:48
Большое спасибо за объяснение psa1974 и V1s1ter. Просто я не знала, что можно использовать несколько таймеров.
А ваше решение V1s1ter мне помогло понять как нарисовать шары в разных местах формы, но там шары только появлялись и не исчезали, так как для меня это сложновато, так как в теории не было толком объяснений, я наконец-то поняла что делать чтобы исчезали шары(вставила Form1.Refresh; ).




Автор: mauar
Дата сообщения: 19.12.2009 23:00
Есть 5 переменных типа string например:
s1..s5 : string;

и 5 переменных типа integer.
a1..a5 : integer;

Я целочисленные переменные перевожу в строковые, у меня получается 10 строковых переменных,

5 переменных с именами s1..s5
и
5 переменных с именами a1..a5.

Далее эти переменные заносятся в

memo1.lines.add((s1)+(s2)+(s3)+(s4)+(s5)+(a1)+(a2)+(a3)+(a4)+(a5));


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

Например чтобы стало вот так.
memo1.lines.add((s1)+(a2)+(a3)+(s5)+(a1)+(s2)+(s3)+(a4)+(s4)+(a5));

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

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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