[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211

    работает 100%.
    Code:
    program Project1;
    
    uses
      windows,wininet,sysutils;
    
    type
        TArray = array of string;
    
    function explode(cDelimiter,  sValue : string; iCount : integer) : TArray;
    var
    s : string; i,p : integer;
    begin
    
            s := sValue; i := 0;
            while length(s) > 0 do
            begin
                    inc(i);
                    SetLength(result, i);
                    p := pos(cDelimiter,s);
    
                    if ( p > 0 ) and ( ( i < iCount ) OR ( iCount = 0) ) then
                    begin
    
    
                            result[i - 1] := copy(s,0,p-1);
    
                            {updated, thanks Irfan}
                            s := copy(s,p + length(cDelimiter),length(s));
                    end else
                    begin result[i - 1] := s;
                            s :=  '';
                    end;
            end;
    
    end;
    
    function DownloadURL_NOCache(const aUrl: string; var s: String): Boolean;
    var
      hSession: HINTERNET;
      hService: HINTERNET;
      lpBuffer: array[0..1024 + 1] of Char;
      dwBytesRead: DWORD;
    begin
      Result := False;
      s := '';
      hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      try
        if Assigned(hSession) then
        begin
          hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);
          if Assigned(hService) then
            try
              while True do
              begin
                dwBytesRead := 1024;
                InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);
                if dwBytesRead = 0 then break;
                lpBuffer[dwBytesRead] := #0;
                s := s + lpBuffer;
              end;
              Result := True;
            finally
              InternetCloseHandle(hService);
            end;
        end;
      finally
        InternetCloseHandle(hSession);
      end;
    end;
    
    var
     s,host:string;
     a4 : integer;
     a:TArray;
    begin
     //1) Есть фаил на хосте (*.txt) (Адрес: http://host.domen/1.txt)
     host := 'http://host.domen/1.txt';
    
     //б) Открыть этот фаил не сохраняя на компе
     DownloadURL_NOCache(host,s);
    
     //Если фаил есть на хосте то: переменая4 = 1
     //Если нет то: переменая4 = 0
     a4:=1;
     if (length(s)=0) then a4:=0;
    
     //1 строчка = переменая1
     //2 строчка = переменая2
     //3 строчка = переменая3
     a:= explode(#13#10,s, 0) ;
    
     //1 строчка = a[0]
     //2 строчка = a[1]
     //3 строчка = a[2]
     //n строчка = a[n-1]
     messagebox(0,pchar(a[0]),pchar(a[1]),0);
    end.
    
     
    2 people like this.
  2. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    eLWAux, для скачивания файла в данном случае думаю легче использовать urlmon.dll
    ))
     
  3. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    с urlmon как-бы вобще легче ) Надо было на WinSock тогда что-ли)
    winsock работает на уровне raw-сокетов, wininet что-то типа обложки для winsock, а urlmon оболочка для wininet
     
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Как в дельфи нажать на кнопку пуск, потом - "Вверх", т.е. VK_UP. Так не получается:
    Code:
         taskbar:=FindWindow('Shell_TrayWnd',nil);
         winkey := FindWindowEx(taskbar, 0, 'Button', nil);
         SendMessage(winkey, WM_LBUTTONDOWN, 0,0);
         SendMessage(winkey, WM_KEYDOWN, VK_UP, 0);
    Чувствую, что надо найти дескриптор пуска, а потом уже ему отсылать комманду, но я хз что за дескриптор в этого окна.
     
    #3564 mailbrush, 7 Jun 2009
    Last edited: 7 Jun 2009
  5. Stil Free

    Stil Free New Member

    Joined:
    20 Dec 2008
    Messages:
    28
    Likes Received:
    4
    Reputations:
    2
    Вопрос остался нерешённым как отправить сообщение через SMTP используя соксы?
     
  6. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Бог с ним, с тем пуском. Есть другой вопрос: есть переменная вида string, которая определяется в процедуре. Её надо вывести в дргой процедуре. Как?
     
  7. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    1) Обьяви ее в классе, тогда получишь доступ со всех методов класса.
    2) Передавай эту переменную как параметр второй процедуре.
     
  8. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    3) Создай глобальную переменную, присвой ей нужное значение с помощью процедуры.
     
  9. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Глобальных переменных лучше избегать тем более если используется ООП )
     
  10. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Это несомненно так. Но переменная же может быть глобальной относительно определенной области видимости, но не всей программы ) Тем более я написал это просто как еще один вариант, не подразумевая, что он лучше предыдущих двух.
     
  11. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    есть длл. длл загружается и запускает поток. этот поток использует глобальный массив. дак вот он его использует всё хорошо работает. дописываю строчку кода и этот массив становится недоступен. похоже это как то связано с размером процедуры потока. проблемму впринципе решил но интерестно в чом прикол был.
     
  12. Stil Free

    Stil Free New Member

    Joined:
    20 Dec 2008
    Messages:
    28
    Likes Received:
    4
    Reputations:
    2
    Как отправить письмо через прокси? Используем IdSMTP
     
  13. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    IdSMTP(IOHandler) -> IdIOHandlerSocket(SocksInfo) -> IdSocksInfo
    Как понятно из названия держит только Socks4/5 прокси
     
  14. Stil Free

    Stil Free New Member

    Joined:
    20 Dec 2008
    Messages:
    28
    Likes Received:
    4
    Reputations:
    2
    Знаю уже юзал пробовал только проблема IdSocksInfo там есть графа где нужно дать компоненту понять какой сокс 5й или 4й.. Икак определитьпо Ипу и порту какой сокс?+ хотелось бы для уверенности увидеть код)
     
  15. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    Чекером... типа Charon или Proxyfire
    А ваще зачастую прокси которые поддерживают S5 держат и S4 , так что ставь S4 и попадание будет 70-80%
     
  16. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Я к сожалению в потоках особо не разобрался, но могу сказать если ты писал под билдером или делфой, скорее всего это результат ошибок этих сред, ну и потом, глобальные переменные это не лучшее решение и тем более массив.
     
    2 people like this.
  17. МongBa†

    МongBa† Member

    Joined:
    12 May 2009
    Messages:
    66
    Likes Received:
    12
    Reputations:
    0
    Угу... есть такая трабла на Делфи
    обычно спасаюсь глобальной переменной crit.. в кажом потоке:
    if crit then sleep(10);
    crit:=true;
    // действия с глоб массивом
    crit:=false;
     
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вообще такие вещи делаются через критические секции типа
    Code:
    var
     CS:TRTLCriticalSection; // глобальная переменная
    .......
    при старте проги делаешь:
     InitializeCriticalSection(CS);
    .....
    в потоках делаешь:
     EnterCriticalSection(CS);
     тут идут нужные действия.
     LeaveCriticalSection(CS);
    
    после выполнения EnterCriticalSection
    система приостанавливает все потоки программы и выполняет код который идет далее.
    Затем после LeaveCriticalSection система опять разрешает работу других потоков.
    т.е. какбы синхронизация но на уровне ядра и просчитана более лучше.
     
    1 person likes this.
  19. Agregat

    Agregat New Member

    Joined:
    15 May 2009
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    Помогите сделать считывание матрицы из текстового файла в данной программе:
    Code:
    uses crt;
    
    type
         PtrStr = ^Str;
         Str = array [1..1] of integer;
    
         PtrMatr = ^Matr;
         Matr = array [1..1] of PtrStr;
    
    var
         matrica: PtrMatr;
         razmer, i, j: integer;
    
    procedure CreateMatr;
    begin
        write ('razmernost matricy: ');
        readln(razmer);
    
        getmem(matrica, razmer*SizeOf(PtrStr));
    
        for i:=1 to razmer do
        getmem(matrica^[i], razmer*SizeOf(integer));
    
        writeln('vvodim elementy:');
        for i:=1 to razmer do
            for j:=1 to razmer do
                readln(matrica^[i]^[j]);
    
    end;    
    
        procedure destroymatrix;
        begin
    
        for i:=1 to razmer do
        freemem(matrica^[i], razmer*SizeOf(integer));
    
        freemem(matrica, razmer*SizeOf(PtrStr));
    
    
        end;
    
        procedure otobrajenie;
        begin
         for i:=1 to razmer do
          begin
            writeln;
            for j:=1 to razmer do
               write(matrica^[i]^[j]:5);
          end;
          writeln;
         end;
    
    
     procedure sortirovka;
        var buffer1, buffer2, buffer3: integer;
        begin
        buffer3:=1;
          for i:=1 to razmer do
          begin
           buffer1:= matrica^[i]^[1];
           buffer2:= matrica^[i]^[i];
           for j:=0 to razmer-1 do
              begin
              if matrica^[i]^[j+1] <= buffer1  then
                begin
                buffer3:=j+1;
                buffer1:=matrica^[i]^[j+1];
                end;
                matrica^[i]^[buffer3]:=buffer2;
                matrica^[i]^[i]:=buffer1;
              end;
           end;
        end;
    
    
    begin
     clrscr;
     CreateMatr;
     otobrajenie;
     sortirovka;
     otobrajenie;
     destroymatrix;
     readln;
    end.
     
  20. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    Agregat, предлагаешь тебе лабу сделать?

    Code:
    procedure CreateMatr;
    var
      F : text;
    begin
      write ('razmernost matricy: ');
      readln(razmer);
    
     assign(F,'README');
     reset(F);
     читаешь пока не eof(F) и записываешь в элемент матрицы
    end;
     
Thread Status:
Not open for further replies.