FORUM.ANTICHAT.RU


PDA

Смотреть полную версию : [ Delphi / Pascal ] — начинающим: задаем вопросы


Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39

tekton
07.02.2011, 11:13
Сории!
Не правильно выразился http://blackstar.clanbb.ru/img/smilies/MyBB/light/tomato.gif
Не снифер, а парсер http://blackstar.clanbb.ru/img/smilies/MyBB/light/blush.gif


Во блин! http://blackstar.clanbb.ru/img/smilies/MyBB/light/shock.gif
А если парсить? Это легче осуществить ? http://blackstar.clanbb.ru/img/smilies/MyBB/light/stupor.gif

Isaev
07.02.2011, 18:02
....


Да нет, как раз правильно, пока кнопка не нажата парсить нечего, а когда нажата нужно сначала отловить запрос (если она вообще для того, чтобы передать какие-то данные) или ты ошибся темой, тут Delphi

tekton
07.02.2011, 18:29
Ну да, я хочу парсер на Delphi и сделать.

А как можно отловить post запрос, который отправляется при клике юзером на кнопку ? http://blackstar.clanbb.ru/img/smilies/MyBB/light/stupor.gif
P.S. Если можно примерчик

Isaev
07.02.2011, 19:31
Зависит от того где находится кнопка... Грубо говоря никак! Если только в очень узком конкретном случае извратишься.

arnis
07.02.2011, 21:40
отснифить можно все другой вопрос сколько на это нужно усилий и знаний.
Тотже HttpAnalyzer снифит все, но и писали его люди довольно подготовленные и не за час времени.

tekton
07.02.2011, 22:00
Есть эта прога.
Тоесть Вы хотите сказать, что я могу включить прогу , выбрать процесс браузера, и после этого отловить запрос который передаётся с другого компа, другим юзером, когда он вводит слово в инпут и тискает кнопку ? ;)

arnis
07.02.2011, 22:18
примерно да.
Но он просто ловит все что идет в сеть а там фильтруй как тебе интересно.
можешь фильтровать по приложению которое в сеть отправляет, также по имени и т.д.

petryxa-mixa
07.02.2011, 22:22
Как сделать чтоб каждая строка была на новой строчке(пробел эмулировать вообщем)
WriteLn (fail_run, 'первая строка вторая строка третья строка');

сам нашёл может кому то пригодится
перенос на следующую строку +#13#10+

trunker
07.02.2011, 22:54
Подскажите пожалуйста какой либо компанент для делфи, через который можно отправлять текст на мыло или асю, у меня RAD studio XE. И как его установить?

arnis
07.02.2011, 22:57
для мыла Инди Idsmtp
для аски поищи в гугле, названия не помню но компонет есть точно знаю

trunker
07.02.2011, 22:59
а как их ставить, что то у меня не получается, раньше на делфи 7 все норм получалось, а на новой понять не могу...

arnis
07.02.2011, 23:19
в ХЕ инди стоит и так
под аську ищи компонент потом смотри как его ставить

trunker
07.02.2011, 23:48
что то для RAD ничего не попадается....
а TICQ Client не ставится(

arnis
07.02.2011, 23:55
Смотри почему не ставится
делай выводы исправляй.
Тут телепатов нет :)

MaTpOc
08.02.2011, 08:47
пaскаль. найти срeднее aрифметическое элeментов с чeтными номерами(индексами) массивa


var
x,n,i:integer;
result:real;
c: array of integer;
e:integer;
begin
for i := 1 to 12 do
readln(c);

for i := 1 to 12 do
begin
if (i Mod 2=0) then
begin
x:=x+c;
n:=n+1;
end;
end;
result:=x/n;
writeln(result);
end.


нужно исправить ошибки, ато прога не хочет работать (

fenixelite
08.02.2011, 09:23
1. Можно цикл заменить на while, с шагом 2. ( не нужно будет проходить по всему массиву)
2. Кол-во четных элементов можно определить как n div 2.

Ну как то так:


var
i,n,sum : Integer;
a : array of integer;
begin
Reset(input,'input.in');
Rewrite(Output,'output.out');
read(n);
for i := 1 to n do
read(a);

sum := 0;
i := 2;

while i <= n do begin
inc(sum, a);
inc(i,2);
end;

Writeln(sum / ( n div 2));
end.

Isaev
08.02.2011, 18:09
Что не хочет работать то?
Написано глупо, но работать будет

$Robin
08.02.2011, 18:54
А readln(c) ? + леваяч переменная e + деление на ноль при n= 1?
fenixelite, кстате тоже деление на ноль будет..

Isaev
08.02.2011, 20:07
readln(c) это компилятор сразу покажет,
деления на ноль не будет, у него n=6 всегда, раз массив задан и цикл тоже жёсткий,
а левых переменных можно сколько хочешь напихать, прога будет работоспособной

fenixelite
09.02.2011, 11:56
Как в NextGrid(таблица для Delphi) сохранить выбранные строки?(если включен MultiSelect)

Isaev
09.02.2011, 17:26
Есть свойство, которое хранит список выделенных строк, делаешь цикл, обходишь список и вохраняешь куда надо.
Если сохраняешь в список того же типа, то можешь просто через Assign присвоить

fenixelite
09.02.2011, 17:53
Не подскажешь, что за свойство? Никак его найти не могу.

qssD
11.02.2011, 12:11
if edit1.Text:= '123' then
button1.Enabled:=true;
Что я не правильно делаю?

qssD
11.02.2011, 12:17
a все.

НTL
11.02.2011, 12:18
if (edit1.Text='123') then
button1.Enabled:=true;

Мой вариант:
if (Form1.Edit1.Text='123') then Form1.Button1.Enabled:=true;

ErrorNeo
11.02.2011, 15:42
теоретический вопрос.

Вводные:

http://ru.wikipedia.org/wiki/Развёрнутый_связный список

Вопрос:

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

Допустим, что кэш процессора - 2мб.

ps. было дело я упорядочивал информацию в виде трехмерных массивов, при этом сам замечал, что при превышении конечным (отдельным) массивом размера в 40-50кб скорость работы с ним резко падает (во много раз). Если же размер конечного массива превысит 150 кб, то скорость падала уже на порядки

В вики 40кб приведено как пример... Но какое значение единицы связанного массива - все же - оптимально? (для 2мб кэша)

arnis
11.02.2011, 15:50
единственная ошибка это двоеточие перед знаком равно
вы же не присваиваете значение а у вас условие.

Isaev
11.02.2011, 17:58
Не стоит он у меня сейчас... а так не помню
Вроде как и везде Selected если поле с галочками есть, можешь просто по нему пробежаться примерно так Cell.AsString='True';

MaTpOc
11.02.2011, 18:46
Объясните пожалуйста, вот есть 1й способ сравнения элементов массива, когда мы 1й элемент сравниваем со всеми остальными элементами массива...

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

ErrorNeo
11.02.2011, 22:02
MaTpOc - твой вопрос не понятен.
Если ты имеешь ввиду алгоритмы сортировки, то вот
http://ru.wikipedia.org/wiki/Методы_сортировки

MaTpOc
12.02.2011, 07:55
не совсем то, мне нужнен метод сравнения, т е нахождение наибольшего и наименьшего, сортировки я усвоил.

=Zeus=
12.02.2011, 15:01
Ну найти максимальный и минимальный элемент без полного перебора не получиться. Тебе код нужен? Вот, на скорую руку, вроде смысл такой.

max = mas;
min = mas;
for i:=0 to N-1 do
begin
if mas > max then
max := mas;
if mas < min then
min := mas;
end;

Dimaus
13.02.2011, 18:10
Помогите написать на делфи калькулятор типа:
a=ac/az
b=bc/bz
c=cc/cz где, a b с дроби(ac, bc, cc: числитель, az ,bz , cz: знаменатель)
нужно в формы ac az bc bz вводить числитель и знаменатель дробей соответственно, а в форме cc cz получать результат: сложения, умножения, вычитания и деления.
a*b=c
a/b=c
a-b=c
a+b=c
Дополнительных условий типа, знаменатель не должен равняться нулю накладывать не нужно.

arnis
13.02.2011, 19:13
На гуглил аз 10 сек http://lectureroom.net/872.html

Dimaus
13.02.2011, 20:05
там с классами, мне нужно на if операторах, самый элементарный. спасибо за ссылку

Wave
13.02.2011, 20:12
http://forum.antichat.ru/thread259092.html

помогите в теме.. ПОЖАЛУЙСТА

MaTpOc
13.02.2011, 21:53
Вот ребят задачка посложнее, НО...решать ниче не надо, код уже есть.

С какого фига она считает не по модулю, если я везде указал что нужно вычитать по модулю?

{Дан массив R(N)<= 50,
Найти наибоьшее и наименьшее значение модуля разности между соседними элементами.
Определить номера элементов, при которых эти значения достигаются.}
uses crt;
type
ar = array of integer;
var
r:ar;
maxmod,minmod:integer;
n,el,el2,i:byte;

procedure FindMaxRMod(r:ar; n:byte; var el,el2:byte);
begin
maxmod := -maxint; minmod := maxint; el := 0; el2 := 0;
for i:=1 to n-1 do
if abs(r-r) > maxmod then
begin
el := i;
maxmod := abs(r-r)
end
else if abs(r-r) < minmod then
begin
el2 := i;
minmod := abs(r-r)
end;
end;

begin
clrscr;
write('Vvedite N: ') ; readln(n);
randomize;
for i:=1 to n do
r:= random(100) - 20;
writeln('Massiv: ') ;
for i:=1 to n do
write(r, ' ') ;
writeln;
FindMaxRMod(r, n, el, el2);
writeln('Max. modul raznosti = ', maxmod, ' - mezhdu elementami r and r') ;
writeln('Min. modul raznosti = ', minmod, ' - mezhdu elementami r and r') ;
readln;
end.


все кароче нашел ошибку )

arnis
13.02.2011, 22:26
Или я не понял что ты хотел или ты сделал не так. ты модуль берешь уже из разницы.

опиши подробнее строку где стоит ABS

MaTpOc
13.02.2011, 22:47
ошибку нашел )

а есть ли разница как записано?

abs(abs(r)-abs(r)) так работает верно

abs(r)-abs(r) так нет

или
abs(r)-r) так тоже не получается :confused:

roker777
14.02.2011, 03:02
Как удалить в тексте слова через одно, допустим было:" Как удалить в тексте слова", а стало:"Как в слова"?

EndLeSSDre@M
14.02.2011, 04:14
ну как бэ разделяешь текст на массив, а потом просто удаляешь из массива все четные ключи, и записываешь массив в строку и се.

roker777
14.02.2011, 13:34
EndLeSSDre@M, как разложить слова в массив я понял, а как удалить четные ячейки? как записать эту строку, это типа: Delete(mas, 2k); ?

arnis
14.02.2011, 15:43
Ну самый простой вариант это инкременент по 2 пока не достигнешь конца.

Еще вариант проверяй четный или нет индекс массива
четность проверяеться так
(a div 2 )* 2 = a если условие верное то число а четное

MaTpOc
14.02.2011, 21:48
Оставить в стрoке S только пoследнее вхoждение каждого симвoла. взaимный порядoк поставленныx симвoлов сохранить.

например:

12k4561k890k24
1561890k24

паскаль, нужно сделать через функцию или процедуру.

Chrome~
14.02.2011, 22:49
Если я тебя правильно понял, то должно быть так:
Str := Func('12k4561k890k24'); // Str := '561890k24';

Если да, тогда попробуй мой вариант:
function LastUniqueOccurrence(Str: String): String;
var
i, j: Integer;
ls, lr: Integer;
begin
ls := Length(Str);

Result := Str;

for i := ls downto 1 do
begin
lr := Length(Result);

for j := 1 to lr do
if Str <> Result then
begin
if j = lr then
Result := Str + Result;
end
else
Break;
end;
end;

...

Str1 := LastUniqueOccurrence(Str2);

MaTpOc
15.02.2011, 21:02
спасибо, все верно, но у меня есть пара вопросов, где переменная Result в var, почему без указания ее типа работает а с ней -нет?

что делает строка Result := Str + Result; ?

spitfire3271
15.02.2011, 22:40
объясните кто-нибудь "Указатели" для чего нужны, с чем есть?!

SVLCH
15.02.2011, 23:18
http://www.intuit.ru/department/pl/cpp/8/3.html

GhostOnline
15.02.2011, 23:51
лучшая статья по указателям, ссылкам, работе с памятью которую я когда либо читал:
http://www.transl-gunsmoker.ru/2009/09/blog-post.html

SVLCH ошибся темой

MaTpOc
15.02.2011, 23:58
объясните мне о result в паскале, почему в проге выше(мой пост) result пашет без объявления его в var , а вот в такой банальной проге ошибку из-за него выдает:

var
i,k:integer;
BEGIN
i:=4;
k:=4;
writeln(123);
result:= i*i;
inc(result);
k:=result;
writeln(k);

END.

//объясните плиз доступным языком что это за такая функция result, что она делает где и как применяется?

Я уже облазил весь гугл, вот там везде в var она прописана, в справке паскаля ABC нету ее вообще, сам попробовал писать ее в функции - пашет, без пфункции не пашет, это если и там и там не объявлять в var. Помогите плиз разобраться

=Zeus=
16.02.2011, 12:33
Матрос, прочитай какую-то нормальную книгу по паскалю, раздел функции и процедуры. Когда ты пишешь
function foo: string;
begin
result := 'This is string'; // значит ресалт будет строка
end;

то это подразумевает, что функция будет возвращать данные типа string, то есть строку. Значит и result у нее будет типа string. Если обьявить
function foo: integer;
begin
result := 3; // значит ресалт будет число
end;

значит ф-ция возвращает число, соответственно ресалт будет иметь тип integer;

Result есть только у функций, его не нужно обьявлять нигде. Эта переменная доступна только в теле своей функции. То есть ты не можешь просто посреди своей программы работать с ней. Ресалт - это те данные, которые вернет ф-ция после своей работы. Теперь подитожим все это простым примером для консоли в делфи:

function Cube(x: integer): integer; // обьявляем свою ф-цию

//...
//Some code goes here
//...

function Cube(x: integer): integer; // описываем ее
begin
result := x*x*x;
end;

// main block
var myVar: integer;
begin
result := 10; // - Ошибка, так нельзя делать
myVar := Cube(3); //присваиваем переменной myVar результат работы ф-ции Cube
writeln( IntToStr(myVar) );
end.

Строго не судите, пытался обьяснить как умел.

Chrome~
16.02.2011, 16:52
Result - переменная, которая используеться для возвращения результата функции. Например, в Паскале можно записывать так (код будет работать правильно):

function MyFunction: string;
begin
// Код функции
Result := 'text'; // Вариант 1. У Result тип string
MyFunction := 'text'; // Вариант 2
// Код функции
end;

arnis
16.02.2011, 19:05
1000% покатит. Проверил на TP7.0

arnis
16.02.2011, 19:35
Если не секрет, а что тебя смутило в первом варианте?

patcher
16.02.2011, 20:26
Ага. Турбо Паскаль 5.0 - точно нету, так же как и в Фри Паскале

InfectedM
16.02.2011, 20:55
помогите с конвертом даты

пишит неверный формат даты.
Что за шляпа?

arnis
16.02.2011, 20:56
Не знал, правда я в 99 учил 7.0

sidapas23
16.02.2011, 21:14
Скажите в чем ошибка:
Код Delphi
procedure TForm1.ComboBox1Change(Sender: TObject);
var
str: TStringlist;
i: integer;
a,c: real;
begin;
if combobox1.Text='Гео' then
memo1.Clear;
memo1.Lines.LoadFromFile('Geo.txt')
c:= 0;
str:= TStringlist.Create;
str.LoadFromFile('Geometr.txt');
for I := 0 to str.Count - 1 do
begin

a:= strtoFloat(str.Strings);
c:= c+a;
end;
Label3.Caption:=FloattoStr(c/str.Count);
end;

вот какую ошибку выдает Unit1.pas(94): Missing operator or semicolon

arnis
16.02.2011, 21:17
Точка запятая после первого бегина лишняя

valeon
17.02.2011, 21:22
Подскажите, как загружать файл в потоке на множество фтп?
procedure TThread.Execute;
...
FIdFTP.Connect;
if FIdFTP.Connected then
...
FIdFTP.Put('С:\1.тхт', '1.txt');
...

чтобы потокобезопасно и было без сбоев?
не брать же каждый раз один и тот же файл в потоке.

arnis
17.02.2011, 21:25
В начале потока загружай в стрим и на фтп уже грузи из стрима.
Или создавай временный файл для каждого потока с уникальным именем и загружай уже временный файл.

#Smith
17.02.2011, 23:06
Друзья, нужна помощь!

Подскажите, где промашку сделал?
Заморочился с property и мне нужно, чтобы было значение поумолчанию.
Но вот не получается.

Кстати, в какую секцию лучше свойства писать, в public или published?

Исходник:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FID: Integer;
public
property ID: Integer read FID write FID default 10;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt('ID = %d', );
end;

end.

arnis
18.02.2011, 00:00
Спецификатор default указывает сохранять значение свойства в файле формы или нет. Если значение свойства совпадает со значением default - значение в файле формы не сохраняется, если значения не равны - сохраняется.
Default не устанавливает первоначальное значение свойства к указанному. Это необходимо сделать в конструкторе компонента.

GhostOnline
18.02.2011, 00:05
#Smith устанавливай поле FID в нужное значние на OnCreate формы

dos999
18.02.2011, 14:06
arnis прав

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FID: Integer;
public
property ID: Integer read FID write FID;
constructor Create;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create;
begin
inherited Create;
FID := 10;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessageFmt('ID = %d', );
end;

end.

смотря для чего использовать будешь в дальнейшем.

GhostOnline
18.02.2011, 14:16
Нет смысла определять конструктор однако, только ради того чтобы одно поле выставить? оО
обработчик то составить проще

dos999
18.02.2011, 15:24
зависит от ситуации. согласен в большинстве случаев подойдёт и FormCreate.

GhostOnline
18.02.2011, 16:02
тут все просто:
если он пишет компонент производный от ТФорм то конструктор, а если просто инициализировать свойства/поля
которые доступны извне - то ФормКреате.
Но я сомневаюсь что он пишет компонент =)

kriperS
20.02.2011, 11:08
в с4 эге по информатике есть такая задача
На вход программе подается набор символов, заканчивающийся точкой
(в программе на языке Бейсик символы можно вводить по одному в строке,
пока не будет введена точка, или считывать данные из файла). Напишите
эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например, Borland Pascal
7.0), которая сначала будет определять, есть ли в этом наборе символы,
соответствующие десятичным цифрам. Если такие символы есть, то можно
ли переставить их так, чтобы полученное число было симметричным
(читалось одинаково как слева направо, так и справа налево). Ведущих
нулей в числе быть не должно, исключение – число 0, запись которого
содержит ровно один ноль.
Если требуемое число составить невозможно, то программа должна вывести
на экран слово “NO”. А если возможно, то в первой строке следует вывести
слово “YES”, а во второй – искомое симметричное число. Если таких чисел
несколько, то программа должна выводить максимальное из них. Например,
пусть на вход подаются следующие символы:
Do not 911 to 09 do.
В данном случае программа должна вывести
YES
91019

и дается решение которое я совсем не понимаю ><

var a:array of integer; {разве в масиве с типом интежер можно ставить апострафы?}
c, c_odd: char;
i, k: integer;
f: boolean;
begin
for c:='0' to '9' do a:=0; {как работает перебирание масива с апострафами }
read(с);
while c<>'.' do
begin
if c in then a := a + 1; {что делает оператор in}
read(c);
end;
k := 0;
for c := '0' to '9' do
if a mod 2 = 1 then
begin
k := k + 1;
c_odd := c
end;
f := (a = 1);
for c := '1' to '9' do
if (a > 1) or (a = 1) and (a = 0) then f := true;
if (k > 1)or not f then writeln('NO') else
begin
writeln('YES');
for c := '9' downto '0' do
for i := 1 to a div 2 do
write(c);
if k = 1 then
write(c_odd);
for c := '0' to '9' do
for i := 1 to a div 2 do
write(c);
end
end.

в коментах написал что именно не понятно , если кто то обьяснит или кинет ссылки где про это рассказывается буду благодарен ><

kriperS
20.02.2011, 11:09
в с4 эге по информатике есть такая задача
На вход программе подается набор символов, заканчивающийся точкой
(в программе на языке Бейсик символы можно вводить по одному в строке,
пока не будет введена точка, или считывать данные из файла). Напишите
эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например, Borland Pascal
7.0), которая сначала будет определять, есть ли в этом наборе символы,
соответствующие десятичным цифрам. Если такие символы есть, то можно
ли переставить их так, чтобы полученное число было симметричным
(читалось одинаково как слева направо, так и справа налево). Ведущих
нулей в числе быть не должно, исключение – число 0, запись которого
содержит ровно один ноль.
Если требуемое число составить невозможно, то программа должна вывести
на экран слово “NO”. А если возможно, то в первой строке следует вывести
слово “YES”, а во второй – искомое симметричное число. Если таких чисел
несколько, то программа должна выводить максимальное из них. Например,
пусть на вход подаются следующие символы:
Do not 911 to 09 do.
В данном случае программа должна вывести
YES
91019

и дается решение которое я совсем не понимаю ><

var a:array of integer; {разве в масиве с типом интежер можно ставить апострафы?}
c, c_odd: char;
i, k: integer;
f: boolean;
begin
for c:='0' to '9' do a:=0; {как работает перебирание масива с апострафами }
read(с);
while c<>'.' do
begin
if c in then a := a + 1; {что делает оператор in}
read(c);
end;
k := 0;
for c := '0' to '9' do
if a mod 2 = 1 then
begin
k := k + 1;
c_odd := c
end;
f := (a = 1);
for c := '1' to '9' do
if (a > 1) or (a = 1) and (a = 0) then f := true;
if (k > 1)or not f then writeln('NO') else
begin
writeln('YES');
for c := '9' downto '0' do
for i := 1 to a div 2 do
write(c);
if k = 1 then
write(c_odd);
for c := '0' to '9' do
for i := 1 to a div 2 do
write(c);
end
end.

в коментах написал что именно не понятно , если кто то обьяснит или кинет ссылки где про это рассказывается буду благодарен ><

$Robin
20.02.2011, 11:52
1) Да, можно. В аппострофах не сами элементы, а их ключи, соответственно ключи типа char, а элементы типа integer
2) Так же как и с integer, только по символам с='0' , '1', ... , '9'
3) Проверяет находится ли элемент в заданном множестве. Т.е. Проверяет является ли значение 'с' одним из символов . Можно погуглить про множества в паскале.

InfectedM
20.02.2011, 21:34
Юзаю компонент HTTPSend
Как в нем отключить прием тела страницы?
Нужно отправить post и принять только заголовок что бы скорость была выше...
Можно там такое сделать, не могу найти чета

life:)
21.02.2011, 12:51
Ребята помоги,мучаюсь не как не могу организовать авторизацию вконтакте и например поменять статус,или оставить сообщение на стене...Или посоветуйте что нибудь...

arnis
21.02.2011, 14:17
Советую поставит анализатор и проанализировать запросы от браузера к серверу. А также ответы и заголовки.
Готовый код врядли кто то даст.

ADR-007
21.02.2011, 14:46
попробуй методом HEAD (якщо потрібно просто взнати чи ця сторінка існує)

life:)
21.02.2011, 14:55
Ну это я то понимаю,что снифом взять запросы как все вставить то пост запросами,и что бы брать пароль и логин с текстовыми полями вот не пойму....
Может кто нить поможет то,по аське хотябы буду благодарин то...

arnis
21.02.2011, 15:02
Пиши код показывай что не получается, может кто то и поможет.
Ты даже не анализировал что отправляет браузер.

InfectedM
21.02.2011, 15:09
не прокатит, блин опять придется winsock юзать значит :(

life:)
Покури статьи с этого блога
http://www.webdelphi.ru/2010/05/synapse-avtorizaciya-v-wordpress-bloge/

waik
21.02.2011, 15:28
Игрался.


Желательно через indy/

arnis
21.02.2011, 15:33
Посмотри снифером, может еще что то передает.
Да и адрес страницы проверь наверное все таки login.php

Timon132009
21.02.2011, 22:17
В опциях IdSSLIOHandlerSocketOpenSSL1 поиграйся с версией протокола. (Method)

GhostOnline
22.02.2011, 00:13
В Synapse что, нету событий и метода типа Abort или Disconnect ?

fenixelite
22.02.2011, 10:23
Есть сайт, где некая информация выводится посредством JS(как в телефонной книге в ВК)
Как мне с помощью WebBrowser'a её лучше спарсить?

arnis
22.02.2011, 11:07
Лучше даже не начинать использовать Веббраузер.
Используй сетевые компоненты которые по душе, инди синапс и тд.

Как получить значение, описано на этом форуме.

fenixelite
22.02.2011, 11:20
Нужна визуализация. Именно поэтому Веббраузер и использую.

arnis
22.02.2011, 11:24
Ну тогда получай код страницы, и парсь нужную тебе информацию.
Как получить код, на форуме есть примеры.

fenixelite
22.02.2011, 11:42
Зайди вконтакт - в телефонную книгу и посмотри как там устроено все. После запроса на JS - телефонные номера в исходном коде не появляются.

arnis
22.02.2011, 11:45
Да ты что :) и что он отправляет?
Смотри код и делай выводы.
Если у тебя в браузере видны цифры то они 10000% есть и у тебя на компьютере, смотри в коде, в заголовках изучай в общем.

fenixelite
22.02.2011, 13:31
Вопрос снят )

valeon
22.02.2011, 22:29
подскажите еще по фтп в потоке

procedure TThread.Execute;
...
FIdFTP.Connect;
if FIdFTP.Connected then
...
fLS:=TStringList.Create;
try
FClient.FIdFTP.List(fLS);
except
FreeAndNil(fLS);
end;
if fLS.Count > 0 then // 15 строка
...

на тестовом сервере точно есть 1 файл и 1 папка.
из 10 раз в половине случаев в fLS ничего не заносится, поэтому 15 строка проходит мимо :( как так, может есть еще какой метод использования List ,чтобы наверняка список файлов и папок куда либо заносился???

fenixelite
23.02.2011, 13:46
Подскажите какой-нибудь алгоритм для удаления дублей. Слышал что-то про сравнение по хэшу(как то так), но мало что нашел.

arnis
23.02.2011, 14:22
Дублей чего?

если файлы то по хешу, если строки то сравнением.

ADR-007
23.02.2011, 15:57
сначала уничтожаешь объект затем вызывает его метод?? (в исключительные ситуации)
если уж обрабатывает исключения то дорабатывает его до конца

взагалі не розумію для чого це (код нижче). якщо я правильно тебе зрозумів то в цьому і є причина проблеми
except
FreeAndNil(fLS);
end;

arnis
23.02.2011, 16:07
Нет вы не правы, это у него обработка ошибок, то есть если произошла ошибка то объект уничтожается.

ADR-007
23.02.2011, 16:31
уничтожается лист fLS а в следующей строке вызывается его метод `fLS.Count`. AV разве не поднималось?
т.е. обрабатывая одно исключение создает второе

и все таки я сомневаюсь что в этом случае нужно разрушать лист ... хотя хз какой там код дальше

fenixelite
23.02.2011, 19:47
+1. Смысл разрушать лист? Если исключение возникнет, то по вине FClient. И нужно уже с ним что-либо делать. И по поводу разрушение листа - при обращении к нему с след. строке опять возникнет исключение.

fenixelite
23.02.2011, 19:50
Вопрос про дубли открыт. Дубли - строки в листе.

arnis
23.02.2011, 19:52
ну если строки, то бери первую и прогоняй по списку как нашёл такую же удаляй. Как дошёл до конца списка оберёшь вторую строку.

ADR-007
23.02.2011, 20:03
вот
function FiltDubl(List:TStrings):TStrings;
var
i:integer
begin
result:= TStringList.Create;
for i :=0 to List.Count-1 do
if Resutl.IndexOf(List.Strings)=-1 then
Result.Add(List.Strings);
end;

GhostOnline
23.02.2011, 20:56
list.Sorted := True;

arnis
23.02.2011, 20:57
это отсортирует, но дубли оставит.

Isaev
23.02.2011, 21:08
Ужс... Вы бы хоть указатели передавали...

GhostOnline
23.02.2011, 21:51
так надо же сразу после создания объекта

Вообще то объектная ссылка в дельфи это и есть указатель. Передается 4 байта а не список строк. Учим матчасть.

090808
24.02.2011, 12:25
list.Sorted := true;
list.Duplicates := dupIgnore;

fenixelite
24.02.2011, 14:57
А еще вопрос есть. Как найти элемент зная его класс?(Webbrowser).
Грубо говоря нужно тыкнуть(именно нажать!) на это:

<a id="Id" class="ClassName" href="URL" rel="async">

fenixelite
24.02.2011, 20:54
Есть вот такой вот простой код.(в uses добавил ssl_openssl )

HTTP.HTTPMethod('Get', 'https://twitter.com/');


Но постоянно возвращает 301. Запросы ни в одном сниффере не отображаются почему-то...Подозреваю, что синапс в поле host приписывает 443 порт. У кого-нибудь есть варианты решения?

arnis
24.02.2011, 21:04
А что лень почитать что значит 301 ошибка? у яши спроси и сразу поймёшь что 301 это редирект с адреса без ввв на адрес с ввв

090808
25.02.2011, 00:12
Насчёт ssl_openssl незнаю, но 301 ошибка возникает из за редиректа. В indy это решается разрешением HandleRedirects.

Тоесть в инди это http.HandleRedirects:=true;

fenixelite
25.02.2011, 09:56
arnis, О боже. Может хватит ответов в стиле "Я ни разу с таким не сталкивался, но дай-ка зайду в гугл, посмотрю и, не проверив, запостю"... :\
Хотя бы в браузере посмотрел, что там нет никакого редиректа на www.

090808, я знаю, что такое 3хх коды возврата. В синапсе нет авторедиректа(насколько я знаю..) все ручками обрабатывается.

Еще раз повторюсь:

Но проверить это предположение не могу, т.к по каким-то причинам ни в одном сниффере запросы на https не отображаются.

Chrome~
25.02.2011, 13:51
fenixelite, в THTTPSend (Synapse) есть такое свойство, как AddPortNumberToHost типа Boolean, которое по умолчанию имеет значение True. Если думаешь, что Synapse дописывает в поле Host порт, тогда установи данное свойство в значение False, и тогда уже точно Synapse ничего дописывать не будет.

Принимай страницу, результат выводи в Memo. В таком случае можно будет без сниффера обойтись.

fenixelite
25.02.2011, 15:34
Chrome~, Я страницу в файл выводил. Только мне нужны то мою запросы, а не ответ сервера.

А догадка оказалась верной. Теперь все отлично стало. Огромное спасибо!

valeon
25.02.2011, 19:35
хорошо, возможно не в том месте использую обработку ошибок.
просто
FClient.FIdFTP.List(fLS);
if fLS.Count > 0 then // 12 строка
все равно, иногда в стринглист ничего не заносится, даже через дебаггер. может sleep поставить после list? поможет?

GhostOnline
25.02.2011, 19:46
Посмотрел твой кодец на прошлой странице.
Проверяй на nil еще:
if (Assigned(fLS)) and (fLS.Count > 0) then ...
а не заносится - тут хз даже
и Sleep ничего не изменит

чтобы проверять на nil можно было оставляй FreeAndNil не меняй просто на Free - это на случай если ты уже поменял

fenixelite
26.02.2011, 10:15
Еще один вопрос насчет Webbrowser'a

Есть такая страница
http://www.фейсбук.ком/home.php#!/search.php?q=1&init=quick&tas=0.04122155806075711&search_first_focus=1298704282224
На ней выводятся некоторые страницы. Если нажать ссылку 'ххх people like this.', то откроется список. Вопрос: Как использовать полосу прокрутки в ЭТОМ СПИСКЕ

RAINUR
26.02.2011, 18:15
Нужно реализовать такую вещь в delphi:
Имеется окно, на котором можно рисовать с помощью canvas.
На верху окна два кружка - красный, синий.
Нажимаешь красный и не отпуская перетаскиваешь на поле, если он оказался на поле, то добавить в поле красный кружочек, который можно перемещать.
Если вынести за пределы окна, то кружочек удаляется, кол-во кружочков должно быть не ограничено.
Как такое можно реализовать?:)
Так же при нажатии на кружок который в окне правой кнопкой мыши, должно выпадать окно, на котором можно его настроить, например уменьшить, увеличить размер:)

arnis
26.02.2011, 18:21
из описания ничего не понятно :(

ADR-007
26.02.2011, 18:58
при FClient.FIdFTP.List (fLS) прога зависает? т.е. запрос идет синхронный или асинхронный? если синхронный то sleep не нужен иначе надо
Sleep (500);
Applications.ProcessMessages; // на всякий пожарний
а лучше поищи событие генерируется при завершении загрузки

ADR-007
26.02.2011, 19:02
не парься с канвой. напиши компонент на основе того который уже это умеет (напр TCustomsControl) и на него накинь TImage, включи DragAndDrob, поставь что надо по событиям OnClick и т.д.

Jed7777
26.02.2011, 23:14
Делаю многопоточное приложение, приложение выполняет все фунции только когда количество потоков равно 1, при большем приложение не выполняет свою функцию.
Код потока и синхронизации:procedure MultiThread.Execute;
begin
while Work do
begin
CS.Enter;
Inc(Acc);
if Acc<Form1.Memo1.Lines.Count then CurAcc:=Acc else Work:=false;
//Form1.ProgressBar1.Max:=Form1.Memo1.Lines.Count-1;
//Form1.ProgressBar1.Position:= Acc;
CS.Leave;

if Work = true then
begin
url:= Form1.Idhttp1.Get(Form1.Memo1.Lines.Strings);
if AnsiPos('charset=UTF-8', url) > 0 then url:=Utf8ToAnsi(url);
Synchronize(Sync);
end;

end;
end;

procedure MultiThread.Sync;
begin
for q:=0 to Form1.Memo2.Lines.Count-1 do begin
RE:=TRegExp.Create(Form1);
RE.Pattern := Form1.Memo2.Lines.Strings+'(*?)'+Form1.Memo3.Lines.Strings;
RE.Global := true;
RE.IgnoreCase := true;
RE.Multiline := true;
mc:= RE.Execute(url) as MatchCollection;
for j := 0 to mc.Count-1 do
begin
mm := mc as Match;
sm := mm.SubMatches as SubMatches;
Form1.Memo4.Lines.Add(sm.Item);
end;
RE.Free;
end;
end;

arnis
26.02.2011, 23:17
Первое что в глаза бросилось, это то что ты во всех потоках юзаеш один и тот же idHTTP создавай в каждом потоке свой отдельный.

ADR-007
27.02.2011, 00:59
изолируй поток от внешнего мира. прога не вылетала с AV? (создай копий объектов в потоке)

параметры передавай при старте потока или типа
with TThread.Create (true) do
begin
param1: = 5;
param2: = 8;
Start;
end;

Jed7777
27.02.2011, 09:54
Как и главное зачем это делать?




Можно пример с этим показать, а то что-то не понял?

090808
27.02.2011, 10:05
Это тоже самое что в одну разетку втыкать две вилки.


Обьяви Http:TIdhttp;

В начале потока:

http:=Tidhttp.create(nil);
http.HandleRedirects:=true;

Потом юзай не idhttp1.get а уже http.get


Тоесть



procedure MultiThread.Execute;
var
Http:Tidhttp;
begin
http:Tidhttp.create(nil);
http.HandleRedirects:=true;
while Work do
begin
http.get('http://ya.ru');
end;
http.free;
end;

Helium
27.02.2011, 11:48
Разобрался

090808
27.02.2011, 12:14
Подключится куда, подробнее

Helium
27.02.2011, 12:22
Разобрался

090808
27.02.2011, 12:28
users idhttp;


По кнопке



var
uns:string
http:Tidhttp;
begin
http:=Tidhttp.create(nil);
uns:=http.get('http://ya.ru');
Showmessage(uns);
http.free;
end;

arnis
27.02.2011, 12:50
не http:Tidhttp.create(nil);
а http:=Tidhttp.create(nil);

пропустил =

090808
27.02.2011, 13:39
ну да:)

Helium
27.02.2011, 13:52
Разобрался

Jed7777
27.02.2011, 17:22
У меня вот такая проблема. Сделал многопоточное приложение, но при многопотоке скорость такая же как и при одном потоке, такое может быть?
Код:

procedure MultiThread.Execute;
var
Http: Tidhttp;
RStream: TStream;
Strings: TStringList;
begin
while Work do
begin
Strings := TStringList.Create;
RStream := TMemoryStream.Create;
http := Tidhttp.create(nil);
HTTP.HandleRedirects:=true;

CS.Enter;
Inc(Acc);
if Acc<Form1.Memo1.Lines.Count then CurAcc:=Acc else Work:=false;
Form1.ProgressBar1.Max:=Form1.Memo1.Lines.Count-1;
Form1.ProgressBar1.Position:= Acc;
CS.Leave;

if Work = true then
begin
try

FAcc:= Copy(Form1.Memo1.Lines.Strings,1,Pos(';',Form1.Memo1.Lines.Strings)-1);
FPas:= Copy(Form1.Memo1.Lines.Strings,Pos(';',Form1.Memo1.Lines.Strings)+1,Length(Form1.Memo1.Lines.Strings));
http.get('http://mail.qip.ru/auth/logon?user='+FAcc+'&dom=qip.ru&domain=qip.ru&reason=login&pass='+FPas,RStream);
RStream.Position:=0;
strings.LoadFromStream(RStream);
url:=Utf8ToAnsi(Strings.Text);
if AnsiPos('âñå ïèñüìà', Strings.Text) > 0 then
Form1.Memo2.Lines.Add(Form1.Memo1.Lines.Strings)
else
Form1.Memo3.Lines.Add(Form1.Memo1.Lines.Strings);
Form1.Label5.Caption:=IntToStr(Form1.Memo1.Lines.Count);
Form1.Label6.Caption:=IntToStr(Form1.Memo2.Lines.Count);
Form1.Label7.Caption:=IntToStr(Form1.Memo3.Lines.Count);
//Synchronize(Sync);
finally
end;
end;
http.free;
Strings.Free;
RStream.Free;
end;

end;

procedure MultiThread.Sync;
begin

end;

arnis
27.02.2011, 17:30
почитай о потоках.

поставь в потоке сип100.
да и по коду не видно как ты запускаешь потоки на выполнение

Jed7777
27.02.2011, 17:32
На выполнение по кнопке:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
Work:=true;
Acc:=-1;
CurAcc:=0;
for i := 1 to StrToInt(Edit1.Text) do
MultiThread.Create(false);
end;

До этого приложения у меня еще есть программы с многопоточностью и там все нормально. но вот тут ни как не могу понять.

arnis
27.02.2011, 17:41
Попробуй поставить слип не большой во время выполнения потока.

GlooK
27.02.2011, 17:43
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
Threads: array of MultiThread;
begin
Work:=true;
Acc:=-1;
CurAcc:=0;
SetLength(Threads, Edit1.Text);
for i := 0 to StrToInt(Edit1.Text) - 1 do
begin
Threads := MultiThread.Create(true);
Threads.FreeOnTerminate := True;
Threads.Resume;
end;
end;

Jed7777
27.02.2011, 17:54
Не помогает, так кажется как будто только последний поток работает, остальные пробегают мимо...


Все работает точно также...

arnis
27.02.2011, 18:09
а где у вас обьявлена переменная Work ???
у вас перывй раз перменная становится фалсе, и все

Jed7777
27.02.2011, 18:13
При клике значение true, потом условие
if Acc<Form1.Memo1.Lines.Count then CurAcc:=Acc else Work:=false;
Становиться false только тогда когда закончатся строчки из Memo1.

arnis
27.02.2011, 18:18
переписывайте все.
в поток выносите только то что требуется. а проверки и весь мусор в основной код.

да и логирование пусть и элементарное очень вам поможет в будущем.

Jed7777
27.02.2011, 18:26
Что я только не пробовал делать... Такой способ тоже делал..

sidapas23
27.02.2011, 21:34
как сделать чтобы в этом код1 вместо Text.txt было имя только что созданного текстового файла кодом 2
код1
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
// открываем блокнот
ShellExecute(Handle, 'open', 'notepad.exe', nil, nil, SW_RESTORE);
sleep(500);// маленько тормознем
h:= FindWindow('Notepad',nil);// находим дескриптор блокнота
h1:= FindwindowEx(h, 0, 'Edit', nil);// находим дескриптор поля ввода блокнота - Edit
if h1 <> 0 then // если найден дескриптор
begin
AssignFile(f, 'Text.txt'); // открываем файл с текстом
Reset(f);
Timer1.Interval:= StrtoInt(Edit1.Text);
Timer1.Enabled:= True;//- врубаем таймер
end;

end;

Sidapas (21:15:56 27/02/2011)
код2procedure TForm1.Button1Click(Sender: TObject);
var
myDate : TDateTime;
myYear, myMonth, myDay : Word;
myHour, myMin, mySec, myMilli : Word;
begin
myDate := now;
DecodeDateTime(myDate, myYear, myMonth, myDay,
myHour, myMin, mySec, myMilli);
Memo1.Lines.SaveToFile(IntToStr(myYear)+'_'+IntToStr(myMonth)+
'_'+IntToStr(myDay)+'_'+IntToStr(myHour)+'_'+IntToStr(myMin)+'_'+IntToStr(mySec)+'.txt');
end;

alexey-m
27.02.2011, 22:12
sidapas23, не проще так сделать? О_о

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile(FormatDateTime('yyyy_mm_dd_hh_nn_ss', Now) + '.txt');
end;

090808
27.02.2011, 22:18
Ну наверное просто переменные надо поставить в другое место :)


А именно эти:


"
myDate : TDateTime;
myYear, myMonth, myDay : Word;
myHour, myMin, mySec, myMilli : Word;
"

ADR-007
28.02.2011, 01:07
type
TMyThread = class (TThread)
private
FParam: integer;
FOnDone: TNotifiEvent; //создадим собитие
protected
procedure Execute; override;
public
Constructor Create(const Param:integer); //overload; //не помню нада ли...
property Param:integer read FParam write FParam;
property OnDone:TNotifiEvent read FOnDone write FOnDone;
end;

implementation

constructor TMyThread. Create(const Param:integer);
begin
inherited Create(false);
FParam:=Param;
FreeOnTerminated:=true;
end;

procedure TMyThread.Execute;
var
IdHttp:TIdHttp;
begin
IdHttp:=TidHttp.Create;
try
//...
//use idhttp
//...
finally
IdHttp.Free;
If Assigned(FOnDone) then //наше собитие (можно использовать для возрата инфи)
Synhronize(FOnDone(Self));
end;
end;

procedure MyProcForCreateThread;
var
MyThread:TMуThread;
begin
with TMyThread.Create(true) do //так
begin //true - создань и усепить
Param:=54;
OnDone:=MyOnDoneProc;
Start;
end;

with TMyThread.Create(54) do//или так
OnDone:=MyOnDoneProc;

//или так
MyThread:=TMyThread.Create(true);
MyThread.Param:=54;
MyThread.OnDone:=MyOnDoneProc;
MyThread.Start;
end;

procedure MyOnDoneProc(Sender:TObject);
begin
Dec(ThreadCount); //собития можно использовать для контроля количества потоков
ShowMessage(IntToStr(TMyThread(Sender).Param)); //или для возрата параметров
end;


ясн?)

Helium
28.02.2011, 13:31
Разобрался

090808
28.02.2011, 14:41
Убрать строку

{$APPTYPE CONSOLE}

Helium
28.02.2011, 15:53
Разобрался

Helium
28.02.2011, 18:03
Разобрался

dos999
28.02.2011, 18:30
попробуй
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
Reg.WriteString('lolo','C:\e.exe');
Reg.CloseKey;
Reg.Free;

alexey-m
28.02.2011, 18:34
Helium, вот тебе пример записи разных данных в реестр:

procedure RegWrite;
var
reg: TRegistry;
Bin: array of Byte;
I: Integer;
begin
for i:= 0 to High(Bin) do Bin:= i;

reg:= TRegistry.Create(KEY_ALL_ACCESS);
with Reg do
try
RootKey:= HKEY_CURRENT_USER;
OpenKey('Software\my_sub_key', True);
WriteInteger('Integer', I);
WriteDate('Date', Now);
WriteBinaryData('BinData', Bin, SizeOf(Bin));
WriteString('String', 'String');
WriteBool('Bool',True);
Reg.WriteFloat('Float',2.366);
CloseKey;
finally
Free;
end;
end;

Helium
28.02.2011, 18:36
Разобрался

alexey-m
28.02.2011, 18:42
ну а кто Reg будет инициализировать, бабушка из соседнего подъезда?

reg:= TRegistry.Create(KEY_ALL_ACCESS);

Helium
28.02.2011, 18:47
Ошибки нет, но в итоге в реестре так же пусто.

alexey-m
28.02.2011, 19:09
винда какая и какие права у приложения?

Helium
28.02.2011, 19:11
SP 2, админские

alexey-m
28.02.2011, 19:55
только сейчас заметил убери "\" перед "Software\..."


procedure RegWrite;
var
reg: TRegistry;
begin

reg:= TRegistry.Create(KEY_ALL_ACCESS);
with Reg do
try
RootKey:= HKEY_LOCAL_MACHINE;
OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
WriteString('lolo','C:\e.exe');
CloseKey;
finally
Free;
end;
end;

Helium
28.02.2011, 20:03
Разобрался

alexey-m
28.02.2011, 20:17
проверяй, что мешает проге записать в реестр данные, код полностью рабочий, на 7ке с правами админа без проблем пишет, отключи авера или проактивку, если имеется)

Cock3r
28.02.2011, 20:25
procedure TForm1.Button1Click(Sender: TObject);
var reg: tregistry;
begin
reg := tregistry.create;
reg.rootkey := hkey_local_machine;
reg.lazywrite := false;
reg.openkey('software\microsoft\windows\currentversion\run', false);
reg.writestring('test', application.exename);
reg.closekey;
reg.free;
end;


добавление в автозапуск
проверено, работает

GhostOnline
28.02.2011, 21:27
по каким книгам учились?
if Work then ...

arnis
28.02.2011, 21:55
Это все придет с времнем и практикой также как и польза от форматирования кода.
Для начинающих так понятней, хотя сразу и палит уровень кодера.

Timon132009
01.03.2011, 12:35
Пробел убери в OpenKey

Helium
01.03.2011, 13:33
Разобрался

arnis
01.03.2011, 13:36
Покажи свой код полностью.
Потому как тот код который приведен тут у всех работает , а у Вас почему то нет.

Helium
01.03.2011, 13:46
Разобрался

arnis
01.03.2011, 14:06
Откомпилировал у себя ваш код, пишет в реестр без проблем.
вы уверены что у вас вызывается процедура RegWrite?

090808
01.03.2011, 14:15
Винда какая?

Helium
01.03.2011, 14:43
вот.

arnis
01.03.2011, 14:49
Ошибка в коде ,а не в данной процедуре.

Helium
01.03.2011, 15:58
Разобрался

alexey-m
01.03.2011, 16:04
константа KEY_ALL_ACCESS в модуле Windows определена, добавь его в uses

Helium
01.03.2011, 16:15
Разобрался

alexey-m
01.03.2011, 16:21
авер или проактивка стоит какая-нибудь? если да, то скорее они блочат доступ к этой ветке реестра, попробуй записать в другой раздел (HKEY_CURRENT_USER)

Helium
01.03.2011, 16:26
Разобрался

fenixelite
01.03.2011, 16:32
Перешел на Delphi XE. Возникла проблема с UrlEncode. Раньше использовал такую функцию:


function Convert(s: string): string;
var
i,j: Integer;
const
rus='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя';
web='%C0%C1%C2%C3%C4%C5%A8%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DC%DB%DA%DD%DE%DF%E0%E1%E2%E3%E4%E5%B8%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FC%FB%FA%FD%FE%FF';
begin
for j := 1 to Length(s) do
if (pos(s,rus)>0) then begin
result:=result+copy(web,3*(pos(s,rus)-1)+1,3);
end
else result:=result+s;
end;


По идее при вводной строке = 'Тест' , я должен получить : %d0%a2%d0%b5%d1%81%d1%82, а получаю : '%D2%E5%F1%F2'.

Наверное проблема в том, что щас строки Unicode стали. Как это решить?

Chrome~
01.03.2011, 17:12
Замени в своей функции все строки с типом string на тип AnsiString.

arnis
01.03.2011, 17:13
Если меня память не подводит то в ХЕ индя сама конвертирует строку как нужно.

А еще можно Pos на AnsiPos заменить

sidapas23
01.03.2011, 17:32
Что за ошибку выдает?

fenixelite
01.03.2011, 18:32
Я использую синапс.
Ни один способ не помог. Результат все тот же. :\

P.S Парни, очень срочно нужно...Видел функцию UnicodeToUtf8..то блин так и не понял, как ей пользоваться :confused:

Chrome~
01.03.2011, 18:46
Попробуй дополнительно заменить rus= на rus: AnsiString = и web= на web: AnsiString =. Также нужно записывать строку запроса самостоятельно (для POST) в Stream (в Synapse есть свойство Document, в него и надо самому записывать) и тогда уже отправлять.

Здесь свои сообщения можно самому удалять...

fenixelite
01.03.2011, 19:07
Неа..вообще никак.. все тот же результат.
А что насчет функции UnicodeToUTF8 думаешь? Никак не пойму, как она работает.

alexey-m
01.03.2011, 20:11
fenixelite, попробуй как-то так, под UrlEncode сам допили =)

function BinToHexStr(Bin: Pointer; nSize: Cardinal): String;
var
i: Cardinal;
bt: Byte;
const
Hex = '0123456789abcdef';
EngNumChar = ;
begin
Result:= '';
for i:= 0 to nSize - 1 do begin
bt:= PByte(Ptr(Cardinal(Bin) + i))^;
if (Char(bt) in EngNumChar) then Result:= Result + Char(bt) else
Result:= Result + '%' + Hex + Hex
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s,ws: AnsiString;
begin
s:= Edit1.Text;
ws:= Utf8Encode(s);
Edit2.Text:= BinToHexStr(Pointer(ws), Length(ws));
end;

fenixelite
01.03.2011, 20:32
Спасибо. Уже сам "ручками" сделал.)
Но эту функцию возьму на заметку!)

SwordMaster
02.03.2011, 18:17
В делфи понимаю плохо ,сделал фейка, но только дизайн.
Хочу что б фейк проверял пароли и отправлял на почту,но после валидного акк, писал сообщение " сервер программы перегружен "
Кто сможет бесплатно сделать такое ?

sidapas23
02.03.2011, 18:52
procedure TForm1.BitBtn3Click(Sender: TObject);
var pas,a,C,del:string;
begin
pas:='Pascal';
a:='ASM';
C:='C++';
del:='Delphi 7.0';
if Label8.Caption='Разработка' then // за разработка надо написать переменные все только пишу переменную а проверяется имя переменной как сделать что бы проверялась строка в переменной?
Form5.Show
else
begin
ShowMessage('Сначала установите среду разработки!')
end;
end;

RAINUR
02.03.2011, 21:05
Изучаю drag-and-drop
Создал Image1, Shape1.
Shape1 перемещается по Form1 ногрмально, но по image1 как то криво, я курсор в одном месте отпускаю, а shape1 появляется в лругом месте:)
Может кто знает как исправить ..

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Shape1: TShape;
procedure Image1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}





procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept :=true;
end;

procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source.ClassName = 'TShape' then
begin
TShape(Source).Top:= Y;
TShape(Source).Left:= X;
end;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source.ClassName = 'TShape' then
begin
TShape(Source).Top:= Y;
TShape(Source).Left:= X;
end;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept :=true;
end;



end.

RAINUR
02.03.2011, 21:19
Исправил:)

procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source.ClassName = 'TShape' then
begin
TShape(Source).Top:= Y+136;
TShape(Source).Left:= X;
end;
end;

RAINUR
02.03.2011, 21:40
procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source.ClassName = 'TShape' then
begin
TShape(Source).Top:= Y+136;
TShape(Source).Left:= X;
end;
end;

Тут у меня идет просто порверка на TShape, а как узнать, переместили Shape1 или Shape2?:)

sidapas23
02.03.2011, 22:37
никто мне не подскажет

alexey-m
02.03.2011, 22:46
TShape(Sender).Name;

alexey-m
02.03.2011, 22:53
sidapas23, извиняюсь конечно, но на твой вопрос

никто, скорее всего, ответа не даст, научись внятно задавать вопросы!

DooD
02.03.2011, 22:54
ага,я те говорил:)

sidapas23
02.03.2011, 22:56
да я уже разобрался

kaka
03.03.2011, 15:58
парни привет.Я знаю что не в тему,но все таки.....кто тут сможет обучить програмированию,ну или доскажет?бюджета пока что как токогого нету....потому чо тока начинаю внедрятся.....если есть такие люди то пишите Лс...Спасибо

fenixelite
03.03.2011, 16:09
Читай книги. Можешь на курсы записаться на intuit.ru(они бесплатные).

От меня вопрос. Как в Synapse получать страницу не полностью?

Helium
04.03.2011, 18:00
Разобрался

fenixelite
04.03.2011, 19:58
Кто может написать мини-скрипт(на чем угодно, хоть батник), который в текстовик выведет все файлы, которые лежат рядом с этим скриптом. Там работы на 2 минуты, просто сейчас под рукой нет ничего.

Буду очень признателен :rolleyes:

ADR-007
04.03.2011, 20:08
сканер портов

unit AdrPortScanner;

interface

uses
Classes,SysUtils,WinSock,AppEvnts,Windows,Forms,Messages;

type
TPortExistsEvent = procedure (Sender:TObject; Port:Integer) of object;
TWorkBeginEvent = procedure (Sender:TObject; Min,Max:integer) of object;

TPortScanner = class abstract
private
FIPAddress: AnsiString;
FOnPortChecking: TPortExistsEvent;
FOnCheckingDone: TNotifyEvent;
FOnPortExists: TPortExistsEvent;
FOnWork: TPortExistsEvent;
FOnWorkBegin: TWorkBeginEvent;
FOnWorkEnd: TNotifyEvent;
FTerminated: boolean;
FTimeOut: Word;
FPortStart: Word;
FPortEnd: Word;
protected
FWorking: boolean;
FMaxOpenPort: Word;
procedure SetMaxOpenPort(const Value: Word); virtual; abstract;
public
constructor Create;

function StartChecking(const URI:string):boolean; overload;
procedure StartChecking; overload; virtual; abstract;
procedure Terminate;

property IPAddress:AnsiString read FIPAddress write FIPAddress;
property MaxOpenPort:Word read FMaxOpenPort write SetMaxOpenPort;
property PortStart:Word read FPortStart write FPortStart;
property PortEnd:Word read FPortEnd write FPortEnd;
property Terminated:boolean read FTerminated write FTerminated;
property TimeOut:Word read FTimeOut write FTimeOut;
property Working:boolean read FWorking;

property OnWork:TPortExistsEvent read FOnWork write FOnWork;
property OnWorkBegin:TWorkBeginEvent read FOnWorkBegin write FOnWorkBegin;
property OnWorkEnd:TNotifyEvent read FOnWorkEnd write FOnWorkEnd;
property OnPortChecking:TPortExistsEvent read FOnPortChecking
write FOnPortChecking;
property OnPortExists:TPortExistsEvent read FOnPortExists
write FOnPortExists;
property OnCheckingDone:TNotifyEvent read FOnCheckingDone
write FOnCheckingDone;
end;

//==============================================================================

TPortScanner1 = class (TPortScanner)
type
TFSocket = record
sa: TSockAddr;
FData: integer;
ATimeOut: word;
end;

private
FSocket: array of TFSocket;
FPort: WORD;
FInfo: TWSADATA;
FHost: integer;
FWorking:boolean;
FTerminated:boolean;

procedure InitSockets;
procedure ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
procedure Checking;
protected
procedure SetMaxOpenPort(const Value: Word); override;
public
constructor Create;
destructor Destroy; override;

procedure StartChecking; override;
end;

function getIPFromHost(const HostName: AnsiString): AnsiString;

implementation//****************************************************************

function GetIPFromHost(const HostName: Ansistring): AnsiString;
type
TaPInAddr = array of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
Result := '';
phe := GetHostByName(PAnsiChar(HostName));
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^ <> nil do
begin
Result := inet_ntoa(pptr^^);
Inc(i);
end;
WSACleanup;
end;

{ TPortScanner1 }

procedure TPortScanner1.ApplicationEventsMessage(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.message>=FPortStart+WM_USER)
and (Msg.message<=FPortEnd+WM_USER)
then
if WSAGETSELECTERROR(Msg.lParam)=0
then
case WSAGETSELECTEVENT(msg.lParam) of
FD_CONNECT:
begin
if Assigned(OnPortExists) then
OnPortExists(Self,Msg.message - WM_USER);
Application.ProcessMessages;
end;
end;
Handled:=false;
end;

procedure TPortScanner1.Checking;
var
i: integer;
buf: in_addr;
begin

FHost:=inet_addr(PAnsiChar(FIPAddress));
if (FPortEnd<=FPortStart)or (FPortEnd>32768)
then FHost:=SOCKET_ERROR;
if FHost=SOCKET_ERROR
then
begin
if Assigned(OnWorkEnd) then
OnWorkEnd(self);
Exit;
end;
buf.S_addr:=FHost;
FPort:=FPortStart;
for i:=0 to MaxOpenPort-1 do
with FSocket do
begin
TimeOut:=0;
FData:=Socket(AF_INET, SOCK_STREAM, 0);
end;
//
while not Terminated do
begin
Application.ProcessMessages;
InitSockets;
if FPort>=FPortEnd
then break;
end;
//
for i:=0 to MaxOpenPort-1 do
CloseSocket(FSocket.FData);
//
end;

constructor TPortScanner1.Create;
var
i: integer;
begin
inherited;
SetLength(FSocket,MaxOpenPort);
if WSAStartup(MAKEWORD(2, 0), FInfo)<>0
then Halt;
for i:=0 to MaxOpenPort-1 do
with FSocket do
begin
ATimeOut := 0;
FData := Socket(AF_INET, SOCK_STREAM, 0);
if FData = SOCKET_ERROR
then
begin
WSACleanup;
Halt;
end;
end;
Application.OnMessage:=ApplicationEventsMessage;
end;

destructor TPortScanner1.Destroy;
var
i: integer;
begin
for i:=0 to MaxOpenPort-1 do
CloseSocket(FSocket.FData);
WSACleanup;
inherited;
end;

procedure TPortScanner1.InitSockets;
var
i,time: word;
begin
for i:=0 to MaxOpenPort-1 do
with FSocket do
if (FPort>=FPortEnd) or (FTerminated)
then break
else
if (GetTickCount-ATimeOut>TimeOut)
then
begin
sa.sin_family:=AF_INET;
sa.sin_addr.S_addr:=FHost;
sa.sin_port:=htons(FPort);
//
WSAAsyncSelect(FData, Application.Handle, WM_USER+FPort, FD_CONNECT);
connect(FData, FSocket.sa, SizeOf(FSocket.sa));
ATimeOut:=GetTickCount;
inc(FPort);
if Assigned(OnWork) then
OnWork(Self,FPort);
Application.ProcessMessages;
//
//Sleep(TimeOut div MaxOpenPort);
time:=GetTickCount;
while GetTickCount-time<TimeOut div MaxOpenPort do
Application.ProcessMessages;
end;
end;

procedure TPortScanner1.SetMaxOpenPort(const Value: Word);
begin
SetLength(FSocket,Value);
FMaxOpenPort:=Value;
end;

procedure TPortScanner1.StartChecking;
begin
if not Working then
begin
FWorking:=true;
if Assigned(OnWorkBegin) then
OnWorkBegin(self,FPortStart,FPortEnd);
try
Checking;
FWorking:=false;
finally
if Assigned(OnWorkEnd) then
OnWorkEnd(self);
end;
end;
end;

{ TPortScanner }

constructor TPortScanner.Create;
begin
inherited;
FTerminated:=false;
FPortStart:=0;
FPortEnd:=MAXSHORT;
FTimeOut:=5000;
FMaxOpenPort:=500;
end;


function TPortScanner.StartChecking(const URI: string): boolean;
var
s:Ansistring;
begin
s:=getIPFromHost(AnsiString(URI));
Result:=s<>'';
if Result then
begin
IPAddress:=s;
StartChecking();
end;
end;

procedure TPortScanner.Terminate;
begin
FTerminated:=true;
end;

end.

arnis
04.03.2011, 20:09
Забирай http://www.sendspace.com/file/yd5har

Cock3r
04.03.2011, 21:55
нужно считать имена файлов из конкретной директории(в массив например), гугление ничего не дало

Linkus
05.03.2011, 03:02
ужас! бедные люди, забаненные гуглом!

http://www.delphisources.ru/pages/faq/faq_delphi_basics/FindFirst.php.html
Первая же ссылка из МОРЯ ссылок, выданных гуглом.

Тебе остаётся только подставить нужную директорию и имя файла *.*

Helium
05.03.2011, 12:38
И, каким образом проверить есть ли подключение к интернету?

arnis
05.03.2011, 12:57
Function IsConnectedToInternet: Boolean;
var
dwConnectionTypes: DWORD;
begin
dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY;
Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;



Uses WinInet; Возращает True если есть соединение

Helium
05.03.2011, 15:08
Замечательно работает.

fenixelite
06.03.2011, 19:13
Как в Synapse получать страницу не полностью? Только только первые n байт?

arnis
06.03.2011, 19:29
В обработчике загрузки ставишь считчик как достиг нужно количества делаешь аборт

fenixelite
07.03.2011, 12:34
Слушай, а как после abort получить код страницы?
В Document пусто...

Helium
07.03.2011, 17:46
Разобрался

RAINUR
07.03.2011, 22:05
Здравствуйте:)
Динамически создаю shape в массиве и использую drag and drop с ними ..
Ну не в это мдело))))
Как в drag and drop плавно перемещать объекты.
То есть, взял мышкой объект. И пока не отпустил кнопку правой мышки, объект движется с мышкой.
Причем если отпустить мышку в неположеном месте, то шарик возвращается обратно:)

ADR-007
08.03.2011, 01:33
код в студию!))

Helium
08.03.2011, 07:54
Разобрался

fenixelite
08.03.2011, 08:38
Так нормально установить таймаут у Synapse?
http.Timeout и HTTP.Sock.SocksTimeout ничего не дают.

ADR-007
08.03.2011, 14:11
на каком месте выбивает? (F7 для пошагового прохода)

Helium
08.03.2011, 14:57
Разобрался

alexey-m
08.03.2011, 21:16
Helium, тебе не приходило в голову, что после успешного if dir<>'C:' then твоя прога просто закрывается после вызова halt; Чудеса) O_o
for i:=1 to 1000000 do
for j:=1 to 1000000 do
q:=q+1;улыбнуло =)

Jed7777
08.03.2011, 21:42
HTTP:=TIdHTTP.create(nil);
data:=Tstringlist.create;
data.Add('user='+FAcc);
data.Add('user='+FPas);
http.Post('http://www.xxx.ru/user/auth', data);
Как поместить результат поста в строку?

Chrome~
08.03.2011, 22:40
var
Str: string;
begin
Str := HTTP.Post('http://www.xxx.ru/user/auth', data);
end;

Jed7777
08.03.2011, 22:58
Пустая строка выводится

Chrome~
08.03.2011, 23:15
Очевидно, так оно и есть. Установите сниффер и смотрите на отправляемый траффик. Возможно, что то не правильно отправляете.

Helium
09.03.2011, 12:47
Разобрался.

AGIMgal
09.03.2011, 16:10
который раз разбиваюсь о своё не умение посылать гет запросы(делфи).
хотелосьбы услышать какой компонент юзать, где он находится, значение каждого параметра функции, соответсвенно что она возвращает, а и тип параметра и возвращаемого. буду Благодарен.

ADR-007
09.03.2011, 16:51
у меня есть объект TList<T>. как безопасно получить доступ к его содержанию из нескольких потоков? (как передать ссылку в поток я в курсе)

GhostOnline
09.03.2011, 17:26
ADR-007 также как и обычно - стандартными способами синхронизации
Как вариант могу предложить решение из свой статьи: Упрощаем разработу многопоточных программ
прилагаемый проект сейчас постараюсь найти и залить

HBWS
09.03.2011, 19:29
1.Как в эту ветку «HKEY_LOCAL_MACHINE -> Software -> Microsoft -> Windows -> CurrentVersion -> Run» добавить строковый параметр со значением "%windir%\notepad.exe" (Delphi)

2. Можно ли узнать, путь, из которого был запущен мой файл и присвоить это значение переменной? Если да, то что нужно добавить в Uses

3. Как перезагрузить комп, насильно закрыв все остальные программы? что нужно добавить в Usesъ

4. Как закрыть окно с определенным заголовком? что нужно добавить в Uses

Helium
09.03.2011, 19:52
1) reg:= TRegistry.Create(KEY_ALL_ACCESS); with Reg do try RootKey:= HKEY_CURRENT_USER; OpenKey('Software\Microsoft\Windows\CurrentVersion \Run',True); WriteString('lolololo','"здесь уже полный путь"'); CloseKey; finally Free; end;
2)GetCurrentDir
3)WinExec(pchar('cmd.exe \c shutdown.exe'),SW_show);

HBWS
09.03.2011, 20:01
И кто знает 4 вопрос

Cock3r
09.03.2011, 22:10
uses Registry;
..........
..........
var reg:TRegistry;
..........
..........
reg:= TRegistry.Create(KEY_ALL_ACCESS);
with Reg do try RootKey:= HKEY_CURRENT_USER;
OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',True);
WriteString('lolololo','"здесь уже полный путь"(я использовал не полный путь, кстати, а application.exename)');
CloseKey;
finally Free;
end;

HBWS
09.03.2011, 22:29
Ну или просто, как закрыть какое-нибудь окно?

arnis
09.03.2011, 22:41
Лови окно по названию и отправляй ему сообщение.
Возможно 2 варианта, или закроется или сделает запрос закрыть или нет зависит от самого приложения.
еще есть вариант что в программе запрещено закрывание.

arnis
10.03.2011, 00:21
У меня задачи такой не стоит. Так что мне это не интересно.

HBWS
10.03.2011, 13:55
Всем спасибо, очень помогли ваши ответы, но есть еще вопрос - Как отключить горячие клавиши в Windows? Типа Ctrl+Shift+Esc, Win+R и т.д.

arnis
10.03.2011, 14:18
В реестре.

Спроси у гугля как отключить горячие клавиши

HBWS
10.03.2011, 21:14
Все предлагаю только ручкуами... Кто-нибудь знает?

arnis
10.03.2011, 21:20
Что значит ручками?
Отключаются он изменением параметров реестра. Мне в свое время нужно было отключать правил реестр и отключал.
В гугле точно есть описание что и как

Cock3r
10.03.2011, 21:23
http://programmersforum.ru/showthread.php?t=93011

DarckUser
11.03.2011, 22:38
Доброго времени. Столкнулся с проблемкой следующего характера: как средствами Делфи считать число с окна и получить его в формате string?

arnis
11.03.2011, 22:40
что за окно?

DarckUser
11.03.2011, 22:42
Окно игрушки.

arnis
11.03.2011, 22:49
Ну как один из вариантов.
делать скриншот, вырезать нужные вам цыферки и отправлять на антигейт.

А так нужно смотреть на саму игрушку, но скорее всего простого пути не будет

ADR-007
12.03.2011, 13:11
установил Gecko ActiveX по етой инструкции но компонент на палитре не появился ...
а на код
with TMozillaBrowser.Create(Self) do
begin
Align:=alClient;
Sleep(10000);
Forms.Application.ProcessMessages;
Navigate('http://www.google.com.ua');
end;
выдает 'Browser is not in a valid state'

Империал
13.03.2011, 09:43
Имеется следующий код:


Case k of
1:
begin
canvas.MoveTo(x1,y1);
canvas.LineTo(x2,y2);
end;
2: canvas.Rectangle();
3:


При попытке скомилировать выдает ошибку вот на этой строчке 2: canvas.Rectangle();
Попытка изменить 2: canvas.Rectangle(); на
2: canvas.Rectangle(x1,y2); ничего не дает.
С чем это связано и как испавить ошибку?

arnis
13.03.2011, 12:26
Rectangle это прямоугольник и задается он 4 точками.

Canvas.Rectangle(x1,y1,x2,y2); //нарисовать прямоугольник (верхний-левый угол в х1,у1 а правый-нижний в х2,у2)

Sams
14.03.2011, 22:47
Есть две структуры:

a = record
a1: dword;
a2: dword;
a3: dword;
end;

b = record;
b1: dword;
b2: dword;
b3: a;
end;

Если взглянуть на структуру b, то в памяти она будет вот так (это не точные значения, приблизительно для примера):
00 00 00 00 00 00 00 00 83 E3 11 66

т.е. в переменную b3 записывает указатель на структуру "а". Собственно от сюда вопрос, можно ли сделать так, что бы там была сама структура "а", а не указатель на нее? (так, как это делается в ассемблере)

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Заранее благодарен.

-------------------------------------------------------------------------

P.S. arnis,

двумя точками задается ;)

Sams
15.03.2011, 01:59
fd00ch, да, ты прав. Я ошибся. Что касается чисто структур, то они влаживаются друг в друга. Всё дело в том, что я использовал массив. Ну тогда откорректирую вопрос:

a = record
a1: dword;
a2: dword;
a3: dword;
end;
b = record;
b1: dword;
b2: dword;
b3: array of a; //ну или не обязательно безразмерный
//b3: array of a;
end;

Можно-ли более менее грамотно это реализовать, не применяя извращений с памятью?

Sams
15.03.2011, 15:04
В общем мне нужно собрать пакет данных для сетевой передачи. Я конечно могу реализовать это дело таким образом packet := packet + NewData; и так заполнять пакет информацией последовательно. Но это убого с точки зрения оптимизации, а особенно в ООП языках высокого уровня.
Хочу сделать красиво и через структуры, т.к. в моем случае они подходят просто идеально.

Представим, что есть пакет, в который записывается информация, но не известно сколько её будет. Например:

data = record
data1: dword;
data2: dword;
end;

packet = record
param1: dword;
param2: dword;
param3: array of data;
end;

param3: array of data; - т.е. внутри структуры я объявил массив структур.
Мне нужно добиться такого результата, что бы при, допустим, SetLength(packet.param3, 2) структура содержала в себе данные этого массива, т.е. две структуры data подряд, а не указатель на сам массив.
Как я понял, нужно как-то выделить внутри packet память, для этого массива. Вот в этом и заключается вся задача, получить выходной пакет в памяти вида:
param1 param2 data.data1 data.data2 data.data1 data.data2 а не param1 param2 <указатель на массив структур data>

Если поможешь, буду весьма благодарен ;)

Sams
15.03.2011, 16:51
Этот вариант не прокатит, потому что у меня пакет состоит из нескольких структур, и после param3 есть еще безразмерные массивы, опять таки структур.
Приблизительно вот так:

packet = record
param1: dword;
param2: dword;
param3: array of data;
param4: array of newdata;
param5: dword;
param6: array of newdata2;
end;
где data, newdata и newdata2 являются структурами

arnis
15.03.2011, 17:27
1 фалсе
2 труе
3 труе
4 труе
5 фалсе

arnis
15.03.2011, 17:55
1 Integer
2 real
3 boolean
4 integer

foozzi
15.03.2011, 18:21
есть возможность вытащить исходники из скомпилиной программы delphi 6-7 или c++ ?

arnis
15.03.2011, 18:41
Нет в читабельном виде не вытащите.
Можно выташить форму, ресурсы, даже пробраз исходника. Но самого кода не будет