.ini uzantısından ip ayarı çekmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
bengoz
Üye
Mesajlar: 6
Kayıt: 28 Eki 2021 03:10

.ini uzantısından ip ayarı çekmek

Mesaj gönderen bengoz »

Selam, çok kısa bahsedeyim maskedit1 MC__ dir. mask edite girilen 2 haneli numarayı örneğin "MC12" program alıp belirli ip adresinin sonuna 10 ekleyerek, yani 10.45.13.__ yerine... eklendiğinde 10.45.13.(12+10) yani 10.45.13.22 şeklinde girmesini sağlamak kısaca mantık bu ben bu başta bulunan sabit ip yi (10.45.13.) ve kaç ekleneceğini (10) .ini dosyasından çekmesini istiyorum. ne yaptıysam başaramadım bu ana formumda değil yardımcı olabilecek var mı?

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Imaging.pngimage, Vcl.ExtCtrls,
  Vcl.StdCtrls, IniFiles, StrUtils, ShellAPI, Vcl.Mask,System.IOUtils,Unit2;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    Timer1: TTimer;
    MaskEdit1: TMaskEdit;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure MaskEdit1KeyPress(Sender: TObject; var Key: Char);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
    function LoadSettings: Boolean;
     procedure ReadSettingsFromIniFile;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  analink: String;
  IPBase: String;
  IPAddition: Integer;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  if not LoadSettings then
  begin
    // Ayarlar yüklenirken bir hata oluştu veya dosya bulunamadı gibi durumlarda buraya gelebilirsiniz.
    // Burada varsayılan değerleri atayabilir veya gerekli işlemleri gerçekleştirebilirsiniz.
    IPBase := '10.45.12.';
    IPAddition := 10;
  end;
end;


procedure TForm1.ReadSettingsFromIniFile;
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create('C:\Users\IT GETUCON\Documents\Embarcadero\Studio\Joint_To_Script\Win64\Debug\settings.ini');
  try
    IPBase := IniFile.ReadString('ConnectionSettings', 'IPBase', '10.45.12.');
    IPAddition := IniFile.ReadInteger('ConnectionSettings', 'IPAddition', 10);
  finally
    IniFile.Free;
  end;
end;



function IsValidEntry(s:String):Boolean;
begin
  Result := Length(s) >= 4;
end;

function TForm1.LoadSettings: Boolean;
var
  IniFilePath: string;
  IniFile: TIniFile;
begin
  Result := False;
  try
    // INI dosyasının yolu oluşturuluyor
    IniFilePath := TPath.Combine(TPath.GetHomePath, 'C:\Users\IT GETUCON\Documents\Embarcadero\Studio\Joint_To_Script\Win64\Debug\settings.ini');

    // INI dosyasını okumak için TIniFile nesnesi oluşturuluyor
    IniFile := TIniFile.Create(IniFilePath);
    try
      // INI dosyasından değerler okunuyor
      IPBase := IniFile.ReadString('ConnectionSettings', 'IPBase', '10.45.12.');
      IPAddition := IniFile.ReadInteger('ConnectionSettings', 'IPAddition', 10);
      Result := True; // Ayarlar başarıyla yüklendiğinde Result değerini True yap
    finally
      IniFile.Free; // TIniFile nesnesini serbest bırak
    end;
  except
    on E: Exception do
      ShowMessage('Ayarlar yüklenirken bir hata oluştu: ' + E.Message);
  end;
end;


procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
var
  TextInMaskEdit: string;
  CursorPos: Integer;
begin
  TextInMaskEdit := MaskEdit1.Text;
  CursorPos := MaskEdit1.SelStart;

  if Key = #8 then // Eğer Backspace tuşuna basıldıysa
  begin
    if (CursorPos >= 1) and (Copy(TextInMaskEdit, CursorPos, 2) = 'MC') then
    begin
      // Eğer imleç "MC" metninin içindeyse, silmeyi engelle
      Key := #0;
    end;
  end;
end;


procedure ExecuteRemoteDesktop(const username, password, link: string);
begin
  ShellExecute(0, 'open', PChar('cmdkey'), PChar('/add:'+link+' /user:'+username+' /pass:'+password), '', SW_SHOWNORMAL);
  ShellExecute(0, 'open', PChar('mstsc'), PChar('/v:'+link+' /f'), '', SW_SHOWNORMAL);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  username: string;
  password: string;
  link: string;
begin
  if (IsValidEntry(MaskEdit1.Text) and IsValidEntry(Edit2.Text)) then
  begin
    username := 'mc\' + MaskEdit1.Text;
    password := Trim(Edit2.Text);

    link := IPBase + IntToStr(StrToInt(AnsiRightStr(Trim(username), 2)) + IPAddition);
    analink := link;

    ExecuteRemoteDesktop(username, password, link);

    Timer1.Interval := 15000;
    Timer1.Enabled := True;
    Form1.Visible := False;

    Application.Terminate;
  end
  else
    ShowMessage('Benutzername und Passwort dürfen nicht leer sein.');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ConfirmExit: Integer;
begin
  ConfirmExit := MessageDlg('Möchten Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0);
  if ConfirmExit = mrYes then
    Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Form2.Show;
Form1.Hide;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  TextInEdit: string;
begin
  if Key = VK_BACK then // Eğer Backspace tuşuna basıldıysa
  begin
    TextInEdit := MaskEdit1.Text;

    // Eğer "MC" metni Edit1 içinde mevcutsa ve seçili bölge "MC" metnini içeriyorsa
    if (Pos('MC', TextInEdit) > 0) and
      ((MaskEdit1.SelStart <= Pos('MC', TextInEdit)) and
      (MaskEdit1.SelStart + MaskEdit1.SelLength >= Pos('MC', TextInEdit) + Length('MC'))) then
    begin
      // Silme işlemini engelle
      Key := 0;
    end;
  end;
end;


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  TextInEdit: string;
  MCPos, SelectionStart, SelectionEnd: Integer;
begin
  if Key = #8 then // Eğer Backspace tuşuna basıldıysa
  begin
    TextInEdit := MaskEdit1.Text;
    MCPos := Pos('MC', TextInEdit);
    SelectionStart := MaskEdit1.SelStart + 1; // Seçimin başlangıç pozisyonu
    SelectionEnd := SelectionStart + MaskEdit1.SelLength; // Seçimin bitiş pozisyonu

    // Eğer "MC" metni Edit1 içinde mevcutsa ve seçili bölge "MC" metnini içeriyorsa
    if (MCPos > 0) and (SelectionStart <= MCPos) and (SelectionEnd >= MCPos + Length('MC')) then
    begin
      Key := #0; // Backspace tuşunu engelle
    end;
  end;
end;



procedure TForm1.Edit2Change(Sender: TObject);
begin
  Edit2.PasswordChar := '*';
end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
  Edit2.Text:='';
end;


procedure ExecuteDeleteCommand(const link: string);
begin
  ShellExecute(0, 'open', 'cmdkey', PChar('/delete:' + link), nil, SW_HIDE);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ExecuteDeleteCommand(analink);

end;

end.
.ini dosyasının içeriği

Kod: Tümünü seç

[
[ConnectionSettings]
IPBase=10.45.13.
IPAddition=12
/code]
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: .ini uzantısından ip ayarı çekmek

Mesaj gönderen ertank »

Merhaba,

Neden MaskEdit kullanmanız gerektiğini bilmiyorum. Şahsen tercih etmez, sadece rakam girişi yapılabilecek bir nesne seçerdim.

- MaskEdit içinde maske değerini doğru verirseniz, MC değerlerinin silinmesi endişeniz olmaz. MaskEdit kendi içinde bunu engeller. Sizin kullanmanız gereken maske değeri \M\C99 şeklinde olmalı. Bu maske için MC değerleri sabit kalır ve silinmez. Eğer IP numarası mutlaka 2 hane olması gerekiyor ise bu kontrolü aşağıdaki kod örneğine eklemeniz gerekir. Örnek 1 rakamını da kullanıcı kodu olarak girilebilecek şekilde hazırlandı.
- Ini dosyalarından değer okurken INI içinde değer yok ise (kayıtlı değil ise) DEFAULT değer belirtilir. Dolayısıyla o noktada okuma sorunu olmaması gerekir. Sizin yazdığınız olası sorun kontrolü kodlarının gereksiz olduğunu düşünüyorum.

Asıl problemin ne olduğunu açıkça belirtmemişsiniz. Forumlarda yardımcı olacak kişilere mümkün mertebe detaylı bilgi vermenizde fayda var. Okuduğunuz değer mi yanlış oluyor? IP numarası hesabı ile ilgili mi sorun var? Hata mı alıyorsunuz? Hata alıyorsanız hata nedir? Nereden kaynaklı tespit edebildiniz mi? Sorun başka birşey mi?

Ayrıca kullandığınız Delphi sürümünü de bildirmemişsiniz. Aşağıdaki kod örnekleri Delphi 11.3 ile çalışmaktadır (açıklamalarınızı ve kodlarınızı anlayabildiğim kadarıyla).

Ünite:

Kod: Tümünü seç

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask;

type
  TForm1 = class(TForm)
    MaskEdit1: TMaskEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FPrefix: string;
    FSuffix: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  System.IniFiles,
  System.IOUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  LTempString: string;
  LUsername: string;
  LPassword: string;
  LIP: string;
begin
  LTempString := string(MaskEdit1.Text).Substring(2).Trim();
  if LTempString.IsEmpty then
  begin
    ShowMessage('Username is empty');
    Exit();
  end;
  LUsername := string(MaskEdit1.Text).Trim();
  LIP := FPrefix + (FSuffix + LTempString.ToInteger()).ToString();

  if string(Edit1.Text).IsEmpty then
  begin
    ShowMessage('Password is empty');
    Exit();
  end;
  LPassword := Edit1.Text;

  // Now remote desktop can be run using above local variables
  // LUsername
  // LPassword
  // LIP
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  LIni: TIniFile;
begin
  LIni := TIniFile.Create(TPath.ChangeExtension(ParamStr(0), '.ini'));
  try
    FPrefix := LIni.ReadString('ConnectionSettings', 'IPBase', '10.45.12.');
    FSuffix := LIni.ReadInteger('ConnectionSettings', 'IPAddition', 10);
  finally
    LIni.Free();
  end;
end;

end.
Form:

Kod: Tümünü seç

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 442
  ClientWidth = 628
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'Segoe UI'
  Font.Style = []
  OnCreate = FormCreate
  TextHeight = 15
  object Label1: TLabel
    Left = 24
    Top = 51
    Width = 53
    Height = 15
    Caption = 'Username'
  end
  object Label2: TLabel
    Left = 24
    Top = 88
    Width = 50
    Height = 15
    Caption = 'Password'
  end
  object MaskEdit1: TMaskEdit
    Left = 83
    Top = 48
    Width = 110
    Height = 23
    EditMask = '\M\C99;1;_'
    MaxLength = 4
    TabOrder = 0
    Text = 'MC  '
  end
  object Button1: TButton
    Left = 216
    Top = 48
    Width = 75
    Height = 56
    Caption = 'Connect'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Edit1: TEdit
    Left = 83
    Top = 85
    Width = 110
    Height = 23
    PasswordChar = '*'
    TabOrder = 2
  end
end
Cevapla