Ver Mensaje Individual
  #4  
Antiguo 16-12-2005
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Reputación: 21
salvica Va por buen camino
Hola soto, salvica de nuevo al aparato

Vamos a ver, el My.ini (por definición) solo puede estar en "x:\" o en "x:\WINDOWS\", te digo lo de "x" porque depende de la unidad de arranque (yo instalé wXP en el disco "D", en cierta ocasión) y además el directorio "WINDOWS" depende del sistema operativo, en w2000 es "WINNT", así que lo primero que haremos será buscar el directorio "WINDOWS"
Código Delphi [-]
{ hay que incluir la unidad Windows en uses}
function GetWinDir:string;
var
  pdWindowsDirectory : PChar;
  dwWDSize : DWord;
begin
  dwWDSize := MAX_PATH + 1;
  GetMem( pcWindowsDirectory, dwWDSize );
  try
    if GetWindowsDirectory( pcWindowsDirectory, dwWDSize ) <> 0 then
       Result := pcWindowsDirectory;
  finally
       FreeMem( pcWindowsDirectory );
  end;
end;

Ahora, en el evento OnLoad del Form, hacemos los pasos para crear My.ini (si no lo encontramos)

Código Delphi [-]
procedure TForm_Main.Form_OnCreate(Sender: TObject);
var
  IniFile : TIniFile;
  tmpIni  : string;
  tmpDir  : string;
  tmpUnit : string[3];
begin
{ localizar el directorio "Windows" }
  tmpIni  := GetWinDir;
  if( Trim(tmpDir)='' ) then begin
    { NO LOCALIZADO, dar mensaje y acabar el proceso }
      ShowMessage( 'Directorio Windows NO LOCALIZADO' );
      Application.Terminate;
      exit;
  end;
{ copiamos los tres primeros caracteres de tmpDir en tmpUnit, el resto no interesa }
  tmpUnit := tmpDir;
{ como no recuerdo si tmpDir acaba en '\' o nó, lo comprobamos }
  if( tmpDir[Length(tmpDir)]<>'\' )
      then tmpDir := tmpDir+'\';
{ comprobamos que My.ini está en x:\WINDOWS o x:\ }
  if FileExists( tmpDir+'MyIni' )
     then tmpIni := tmpDir +'MyIni'
     else tmpIni := tmpUnit+'MyIni'; // si no lo encontramos, obligamos a que esté en x:\
{ cargamos My.ini (si existe), sinó estará en blanco }
  IniFile := TIniFile.Create( tmpIni );
  with IniFile do begin
       if( ReadString('mysqld', 'basedir', '')='' ) then begin
         { no habiamos encontrado My.ini, debemos crearlo entero
           *** los valores son un ejemplo, tú pon los que quieras ***
               cuando en My.ini una línea comienza por "#" es un comentario
                   no se si una variable puede empezar por ese carácter, asi
                   que si falla o dá errores no creamos la línea
         }
           WriteString('mysqld', 'basedir',          'G:/WWW/Apache/mysql');
           WriteString('mysqld', '#bind-address',    '192.168.0.1');
           WriteString('mysqld', 'datadir',          'G:/WWW/Apache/mysql/data');
           WriteString('mysqld', 'language',         'G:/WWW/Apache/mysql/share/spanish');
           WriteString('mysqld', '#slow query log#', '');
           WriteString('mysqld', '#tmpdir#',         '');
           WriteString('mysqld', 'port',             '3306');
           WriteString('mysqld', '#set-variable',    'key_buffer=16M');
           
           WriteString('WinMySQLadmin', 'Server',    'G:/WWW/Apache/mysql/bin/mysqld-nt.exe');
           WriteString('WinMySQLadmin', 'user',      'salvica');
           WriteString('WinMySQLadmin', 'password',  'aquí va la tuya');
       end;
     { ahora añadimos (si no existen) las secciones:
           - ArchivosdePrograma
           - BORRAME
     }
       if( ReadString('ArchivosdePrograma', 'basedir', '')='' ) then begin
           WriteString('ArchivosdePrograma', 'basedir', tmpUnit+'Archivos de programa/Soft/MySQL');
           WriteString('ArchivosdePrograma', 'datadir', tmpUnit+'Archivos de programa/Soft/MySQL/data');
       end;
       if( ReadString('BORRAME', 'basedir', '')='' ) then begin
           WriteString('BORRAME', 'basedir', tmpUnit+'BORRAME/Soft/MySQL');
           WriteString('BORRAME', 'datadir', tmpUnit+'BORRAME/Soft/MySQL/data');
       end;
     { ahora quitamos el objeto TIniFile de la memoria }
       Free;
  end;
{ como no he comprobado nunca si los valores se graban según se van creando,
  añadiremos aquí la sección "original" que contendrá los mismos valores que
  la sección "mysqld" (por si en algún momento quieres dejar las cosas como
  estaban originalmente 
}
  IniFile := TIniFile.Create( tmpIni );
  with IniFile do begin
       if( ReadString('original', 'basedir', '')='' ) then begin
           WriteString('original', 'basedir', ReadString('mysqld', 'basedir', ''));
           WriteString('original', 'datadir', ReadString('mysqld', 'datadir', ''));
       end;
     { ahora quitamos el objeto TIniFile de la memoria }
       Free;
  end;
end;

Una vez llegado a este punto, tendrias que poner en la sección "mysqld" el contenido bien de la sección "ArchivosdePrograma" o bien el de la "BORRAME" dependiendo de un valor externo (Aplicación de consola) o por el estado de un "CheckBox" y hacer más o menos lo que yo he hecho con la sección "original"

Espero que todo este rollo te sirva para algo, en caso contrario sigue chiflando....
Saludos: salvica
Responder Con Cita